https://github.com/yaitskov/j4ts/blob/stream/src/main/java/javaemul/internal/stream/StreamHelper.java
отрим следующий код:
urls.stream()
.flatMap(url -> fetchDataFromInternet(url).stream())
.filter(...)
.findFirst()
.get();
БудетfetchDataFromInternet
вызывать второй URL, когда первого было достаточно?
Я попробовал с меньшим примером, и это похоже на работу, как ожидалось. то есть обрабатывает данные один за другим, но можно ли полагаться на это поведение? Если нет, звонит ли.sequential()
до.flatMap(...)
Помогите?
Stream.of("one", "two", "three")
.flatMap(num -> {
System.out.println("Processing " + num);
// return FetchFromInternetForNum(num).data().stream();
return Stream.of(num);
})
.peek(num -> System.out.println("Peek before filter: "+ num))
.filter(num -> num.length() > 0)
.peek(num -> System.out.println("Peek after filter: "+ num))
.forEach(num -> {
System.out.println("Done " + num);
});
Выход:
Processing one
Peek before filter: one
Peek after filter: one
Done one
Processing two
Peek before filter: two
Peek after filter: two
Done two
Processing three
Peek before filter: three
Peek after filter: three
Done three
Обновить: Использование официального Oracle JDK8, если это важно для реализации
ОтветНа основании комментариев и ответов ниже, плоская карта частично ленива. Т.е. полностью читает первый поток и только при необходимости он переходит к следующему. Читать поток очень хочется, но читать несколько потоков лениво.
Если это поведение предназначено, API должен позволить функции возвращатьIterable
вместо потока.
Другими словами:ссылка