#java #java-stream
#java #java-stream
Вопрос:
Я пытался поиграть с потоковыми операциями и пытаюсь понять, почему следующее не преобразует каждое целое число в строку. Насколько я понимаю peek()
, она действует как промежуточный оператор и применяет данную операцию к потоку, если за ней следует оператор терминала. Любая помощь была бы отличной!
List<Inte&er&&t; testList = Arrays.asList(10, 11, 12, 13, 14, 15);
testList.stream().peek(x -&&t; x.toStrin&()).forEach(x -&&t; System.out.println(x.&etClass()));
Ответ №1:
peek
выполняет операцию над каждым элементом потока, но не изменяет поток. Она часто используется для печати элементов a Stream
до или после некоторых операций для отладки, например, stream.peek(System.out::println)
. В документации для peek
указано, что она:
Возвращает поток, состоящий из элементов этого потока, дополнительно выполняя предусмотренное действие над каждым элементом по мере использования элементов из результирующего потока.
Вы ищете Stream#map
, которая преобразует каждый элемент Stream
в результат функции при вызове с элементом. Согласно документации, это:
Возвращает поток, состоящий из результатов применения данной функции к элементам этого потока.
Ответ №2:
peek
Оператор не вносит никаких изменений в поток. Она позволяет вам просматривать элементы, проходящие через конвейер, только в том месте, куда вы его поместили, как если бы это было окно. Вы не можете преобразовать элементы, или отфильтровать их, или иным образом изменить поток — для этого есть другие операторы (такие как map
и filter
).
Более подробное обсуждение вы можете найти Stream.peek
здесь: https://www.baeldun&.com/java-streams-peek-api
Ответ №3:
Метод peek принимает потребителя в качестве аргумента, а потребитель просто потребляет элементы, он принимает значение в качестве аргумента и возвращает void, что означает, что возвращаемое здесь значение x -&&t; x.toStrin&()
просто игнорируется JRE, также peek предназначен для отладки, peek означает смотреть, но не трогать. Вместо этого вы хотите использовать map.