Ниже приведен традиционный код для проверки некоторых условий и обновления переменной.
HashMap<Integer,Integer> testMap= new HashMap<>();
int pair = 0;
for(Integer value: testMap.values()){
pair = pair+value/2;
}
Как того же можно достичь с помощью потоков java8 или лямбда-выражений?
... а что вы пробовали?
Я упомянул, что пробовал, и надеюсь, что понял свой вопрос.




stream значения Map, преобразовать их, затем sum()
int pair = testMap.values().stream().mapToInt(i -> i / 2).sum();
Чтобы он выглядел немного более похожим на ваш исходный код, вы можете использовать операцию reduce():
int pair = testMap.values()
.stream()
.reduce(0, (p, i) -> p + i / 2);
Обычно это начинается со значения 0 («идентичность»), а затем передается результат применения функции сокращения в качестве входных данных вместе с текущим значением для каждого значения по очереди.
P.S. программа к интерфейсу:
Map<Integer, Integer> testMap = new HashMap<>();
Спасибо @nullpointer. Теперь сделаю все в коробке, но я полагаю, что это не такая уж большая проблема.
@nullpointer mapToInt означает, что сокращение выполняется с помощью int. Без него сокращение произойдет с Integer и будет распаковано в конце. Это означает, что при расчете нужно много боксировать и распаковывать.
Или int pair = testMap.values().stream().mapToInt(Integer::intValue).sum() / 2;
@Holger результаты будут отличаться из-за целочисленного деления.
Ну да, если есть нечетные значения. Если это так, это будет очень интересный вопрос, какой результат действительно предназначен для конкретного варианта использования.
Справедливый пункт @Holger. Я просто воспроизвел результат, который в настоящее время дает код OP.
Я не вижу здесь никаких условий.