Метод map() и метод flatMap() выполняют сходные задачи, но имеют различия в своем поведении.
map() принимает на вход функцию, преобразующую каждый элемент исходного потока в некоторое значение другого типа. Затем он выдает новый поток, состоящий из преобразованных значений. Возвращаемое значение функции передается в новый поток как отдельный элемент.
flatMap() также принимает на вход функцию, которая преобразует каждый элемент исходного потока, но возвращаемое значение этой функции - это еще один поток. После преобразования каждого элемента исходного потока flatMap() соединяет потоки в один общий поток, который и возвращается.
Таким образом, основное отличие между map() и flatMap() заключается в том, что map() возвращает поток, состоящий из элементов, полученных после преобразования каждого из элементов исходного потока, в то время как flatMap() возвращает один общий поток, состоящий из элементов, полученных после преобразования каждого из элементов исходного потока и последующего объединения всех потоков в один.
Пример:
List<List<Integer>> numbers = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6));
// map()
List<Integer> mappedNumbers = numbers.stream()
.map(List::stream)
.flatMap(stream -> stream)
.collect(Collectors.toList());
System.out.println(mappedNumbers); // Output: [1, 2, 3, 4, 5, 6]
// flatMap()
List<Integer> flattenedNumbers = numbers.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flattenedNumbers); // Output: [1, 2, 3, 4, 5, 6]
В данном примере метод map() возвращает поток потоков целых чисел, а затем метод flatMap() преобразует его в общий поток целых чисел.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov