Путать в результатах Java Stream, используя peek и findAny - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в Java Stream API, и я запутался в результатах этого случая:

Stream<String> stream = Stream.of("A","B","C","D");
System.out.println(stream.peek(System.out::println).findAny().get());

Это печатает:

A
A

Почему он не печатает:

A
A
B
B
C
C
D
D

1 Ответ

0 голосов
/ 06 февраля 2019

Метод findAny не находит все элементы;он находит только один элемент.

Возвращает Optional, описывающий некоторый элемент потока, или пустой Optional, если поток пустой.

Это короткийработа терминала с коммутацией каналов.

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

В случаях, когда реализация потока может оптимизироватьбез создания некоторых или всех элементов (например, с помощью операций короткого замыкания, таких как findFirst, или в примере, описанном в count()), действие не будет вызываться для этих элементов.

Метод findAny имеет короткое замыкание, поэтому действие peek будет вызываться только для элемента, найденного findAny.

. Поэтому вы получаете только два значения A враспечатка.Один печатается методом peek, а второй - значением внутри Optional, возвращаемым findAny.

...