英文:
Java stream peek() operation
问题
我一直在尝试使用流操作,并试图理解为什么以下代码不会将每个整数转换为字符串。我对peek()
的理解是它充当中间操作符,如果后面跟着一个终端操作符,则将给定操作应用于流。任何帮助都会很棒!
List<Integer> testList = Arrays.asList(10, 11, 12, 13, 14, 15);
testList.stream().peek(x -> x.toString()).forEach(x -> System.out.println(x.getClass()));
英文:
I've been trying to play around with stream operations, and am trying to understand why the following doesn't convert each integer to a string. My understanding of peek()
is that it acts as an intermediate operator, and applies the given operation to the stream if it is followed by a terminal operator. Any help would be great!
List<Integer> testList = Arrays.asList(10, 11, 12, 13, 14, 15);
testList.stream().peek(x -> x.toString()).forEach(x -> System.out.println(x.getClass()));
答案1
得分: 3
peek
对每个流元素执行操作,但不修改流。它通常用于在调试期间在某些操作之前或之后打印 Stream
的元素,例如 stream.peek(System.out::println)
。peek
的文档 表明:
返回一个由此流的元素组成的流,另外对从生成的流中消耗的每个元素执行提供的操作。
你正在寻找 Stream#map
,它会在调用该函数时将 Stream
的每个元素转换为函数的结果。根据文档:
返回一个由将给定函数应用于此流的元素的结果组成的流。
英文:
peek
performs the operation on each stream element, but does not modify the stream. It is often used to print the elements of a Stream
before or after some operations for debugging, e.g. stream.peek(System.out::println)
. The documentation for peek
states that it:
> Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.
You are looking for Stream#map
, which converts each element of the Stream
to the result of the function when called with the element. According to the documentation, it:
> Returns a stream consisting of the results of applying the given function to the elements of this stream.
答案2
得分: 0
peek
运算符不对流进行任何更改。它只允许您查看流经管道的项目,就像它是一个窗口一样。您不能转换项目,也不能过滤它们,或以其他方式修改流 - 还有其他运算符可以做到这一点(例如map
和filter
)。
您可以在这里找到有关Stream.peek
的更长讨论:https://www.baeldung.com/java-streams-peek-api
英文:
The peek
operator makes no changes to the stream. It only allows you to look at the items that are flowing through the pipeline in the location where you put it, as if it was a window. You cannot transform the items, or filter them, or otherwise modify the stream - there are other operators for that (such as map
and filter
).
You can find a longer discussion on Stream.peek
here: https://www.baeldung.com/java-streams-peek-api
答案3
得分: 0
这个方法 peek 接受一个 consumer 作为参数,而 consumer 只是消耗它所接受的元素,它接受一个值作为参数并返回一个 void,这意味着这里返回的值 x -> x.toString()
在 JRE 中会被忽略,而 peek 通常用于调试,peek 的意思是看但不触摸。你应该使用 map 而不是 peek。
英文:
The method peek take a consumer as argument, and consumer just consumes elements it take a value as argument and returns a void, which means that the value returned here x -> x.toString()
is juste ignored by the JRE, also peek is destinated for debugging, peek means look but don't touch. You want to use map instead.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论