Возврат или сбор значения при итерации через Hashmap с использованием java8

Ниже приведен традиционный код для проверки некоторых условий и обновления переменной.

HashMap<Integer,Integer> testMap= new HashMap<>();
int pair = 0;
for(Integer value: testMap.values()){
        pair = pair+value/2;
}

Как того же можно достичь с помощью потоков java8 или лямбда-выражений?

Я не вижу здесь никаких условий.

Boris the Spider 31.12.2018 19:10

... а что вы пробовали?

Naman 31.12.2018 19:13

Я упомянул, что пробовал, и надеюсь, что понял свой вопрос.

developer 31.12.2018 20:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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. Теперь сделаю все в коробке, но я полагаю, что это не такая уж большая проблема.

Boris the Spider 31.12.2018 19:22

@nullpointer mapToInt означает, что сокращение выполняется с помощью int. Без него сокращение произойдет с Integer и будет распаковано в конце. Это означает, что при расчете нужно много боксировать и распаковывать.

Boris the Spider 31.12.2018 19:32

Или int pair = testMap.values().stream().mapToInt(Integer::intValue).sum() / 2;

Holger 07.01.2019 18:40

@Holger результаты будут отличаться из-за целочисленного деления.

Boris the Spider 07.01.2019 18:56

Ну да, если есть нечетные значения. Если это так, это будет очень интересный вопрос, какой результат действительно предназначен для конкретного варианта использования.

Holger 07.01.2019 18:58

Справедливый пункт @Holger. Я просто воспроизвел результат, который в настоящее время дает код OP.

Boris the Spider 07.01.2019 18:59

Другие вопросы по теме