Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

В чем разница между методами map и flatMap в Java 8?

#java #потоки_данных #java_8 #java_stream #java_faq


Чем отличаются методы Stream.map и Stream.flatMap друг от друга?
    


Ответы

Ответ 1



И map и flatMap могут быть применены к стриму Stream и оба возвращают стрим Stream. Разница заключается в том, что операция map создает одно выходное значение для каждого входного значения, тогда как операция flatMap создает произвольное число(ноль или больше) значений для каждого входного значения. Операция map(О работе map на русском) в качестве аргумента принимает Function(например, лямбду), которая вызывается для каждого значения входного стрима(который ), преобразует это значение в другое значение, и посылает получившееся значение в выходной стрим(который ). Т.е. map для каждого объекта в стриме возвращает по 1 объекту, потом преобразует все объекты в итоговый стрим. Операция flatMap(О работе flatMap на русском) принимает функцию (которая преобразует каждое значение входного стрима в стрим), применяет ее к каждому элементу, и на выходе возвращает стрим с одним, несколькими или ни c одним из элементов для каждого элемента входящего стрима. Т.е., flatMap возвращает по стриму для каждого объекта в первоначальном стриме, а затем результирующие потоки объединяются в исходный стрим. Пример для map: есть одномерный массив array с числами. Нужно получить массив из первоначального массива, в котором к каждому числу прибавлена 1. Решение: array = Arrays.stream(array) //преобразовываем массив в стрим .map(i -> i+1) //преобразовываем каждый элемент стрима .toArray(); //преобразовываем стрим в массив map к каждому значению стрима прибавляет 1, потом все новые значения преобразует в итоговый стрим. Пример для flatMap: есть двухмерный array с числами, надо получить одномерный массив с числами. Решение: secondArray = Arrays.stream(array) .flatMapToInt(i -> Arrays.stream(i)) //преобразовываем Stream в Stream .toArray(); // преобразовываем Stream в int[] В этом примере создается стрим состоящий из каждого элемента первоначального массива - т.е. стрим из массивов. Потом с помощью i -> Arrays.stream(i) преобразовываем каждый элемент(который является массивом) стрима в стрим с числами. После этого flatMap собирает все получившееся стримы в один итоговый стрим.

Комментариев нет:

Отправить комментарий