2017-02-11 3 views
1

Я новичок в java, и я возился с циклами forEach.Использование переменной вне цикла forEach

Я хочу использовать entry.getValue() вне цикла, как это:

hashmap.entrySet().stream() 
    .sorted(Map.Entry<String,Double>comparingByValue()) 
    .limit(1).forEach(entry-> 
     {System.out.print("Worst output: " + entry.getValue() + ");} 
    ); 
....//print the one iteration of previous loop, or use entry.getValue() as var 
+4

Чтобы быть уверенным - вы ищете наименьшее значение на карте? – Mureinik

+3

Итак, каков результат того, что вы уже делаете? – Buhb

+0

Результат - самое низкое значение хэш-карты. im просто ищет для использования entry.getValue() вне цикла – Heist

ответ

3

Я верю, что вы хотите map свои записи в double, а затем использовать DoubleStream.min() с чем-то вроде,

double worst = hashmap.entrySet().stream() 
     .mapToDouble(Map.Entry<String,Double>::getValue).min().getAsDouble(); 
System.out.println("Worst output: " + worst); 

Если вы действительно хотите использовать максимальное значение max() вместо min().

+0

Могу ли я получить соответствующий ключ этому значению и поместить его в нечто вроде String w = ... – Heist

+1

Это вызовет исключение NoSuchElementException в случае пустой карты. Исходный код просто ничего не напечатал. – Buhb

+0

Вам не нужно отображать карту с помощью 'Map.Entry :: getValue', если вы сначала переходите через' values ​​() ', а не' entrySet() '. И если мы не потоком, классическое решение так же просто, как «double-худшее = Collections.min (hashmap.values ​​());' – Holger

2

Вы могли бы просто использовать метод max, чтобы получить наибольшее значение:

Double max = hashmap.values() 
        .stream() 
        .max(Comparator.naturalOrder()) 
        .orElse(null); 
+1

Это не компилирует – Buhb

+1

@Buhb глупое копирование пасты, спасибо - отредактировано и исправлено. – Mureinik

2

Если вы хотите сделать что-то со всей Map.Entry, а также элегантно обрабатывать пустые карты, я предлагаю вам сделать это с Необязательный.

Optional<Map.Entry<String, Double>> o = hashmap.entrySet().stream().min(Map.Entry.comparingByValue()); 
o.ifPresent(entry -> System.out.println(entry.getKey() + " " + entry.getValue())); 

Таким образом, если есть хотя бы одна запись в карте, самый нижний из них возвращается, и так как она обернута в дополнительный, вы можете легко обрабатывать пустой корпус, а также. В приведенном выше примере кода он будет печатать как ключ, так и значение, если он присутствует, или ничего не делать, если это не так.

Смежные вопросы