Как соотносятся методы flatMap в классах Optional и Stream в Java?
Ответ от нейросети
sobes.tech AI
Метод flatMap в классах Optional и Stream в Java служит для схожей цели — преобразования и "расплющивания" вложенных структур, но применяется в разных контекстах.
-
В
Stream<T>методflatMapпринимает функцию, которая для каждого элемента возвращает поток (Stream<U>), и объединяет все эти потоки в один плоский поток (Stream<U>). Это удобно, когда каждый элемент исходного потока может соответствовать множеству элементов в результирующем потоке. -
В
Optional<T>методflatMapпринимает функцию, возвращающуюOptional<U>, и если исходныйOptionalне пуст, возвращает результат этой функции, иначе — пустойOptional. Это позволяет избежать вложенныхOptional<Optional<U>>.
Пример для Stream:
List<List<String>> list = List.of(List.of("a", "b"), List.of("c", "d"));
List<String> flat = list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()); // ["a", "b", "c", "d"]
Пример для Optional:
Optional<String> optional = Optional.of("123");
Optional<Integer> result = optional.flatMap(s -> {
try {
return Optional.of(Integer.parseInt(s));
} catch (NumberFormatException e) {
return Optional.empty();
}
});
Таким образом, оба метода "расплющивают" вложенные структуры, но Stream.flatMap работает с потоками элементов, а Optional.flatMap — с вложенными опциональными значениями.