我有两条语句,我期望它们应该“打印”相同的结果:
Arrays.stream("abc".split("")).forEach(System.out::println);//first
Arrays.stream("abc".split("")).peek(new Consumer<String>() {//second
@Override
public void accept(String s) {
System.out.println(s);//breakpoint
}
});
事实上,第一条语句将打印
a
b
c
好的,但是第二条语句什么也没打印。我尝试在 IntelliJ 内的“//breakpoint”行中设置断点,但没有命中。
那么,我应该如何更改第二个语句以使用“peek”,因为它在使用“Consumer”处理每个元素时创建一个新流?
多谢。
Stream.peek正如 API 的 javadoc 中所述,主要用于调试目的,不建议在查看操作期间对流执行任何更新操作。
例如,您可以使用以下代码验证中间流状态及其最终结果:
Arrays.stream("acb".split(""))
.peek(System.out::println) // print a c b
.sorted()
.forEach(System.out::println); // print a b c
一般来说,这个操作是一个中间操作不会被执行,除非并且终端操作如中提到的那样在流上执行流操作和管道文档的部分,这正是您的原因第一个语句将打印.
Note:虽然正如其他一些答案中所建议的,但其中的行动peek
当它能够优化某些短路操作的结果(例如findFirst
etc.
如果流实现能够优化掉
生产部分或全部元素(例如短路像这样的操作findFirst
,或者在中描述的示例中count()
),
不会为这些元素调用该操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)