为了账号安全,请及时绑定邮箱和手机立即绑定

非干扰运算符不显示其内容

非干扰运算符不显示其内容

蝴蝶不菲 2021-10-20 14:19:14
请您告诉我 peek 操作符不显示 system.out.print 的原因吗?代码:public static void main(String[] args) {    //try stream.of    List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);     Stream<Integer> p = numbers    .stream()    .filter(x -> x >= 5)    .peek(x-> System.out.print("peek at: " + x));     System.out.print("peek at: ");}
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

peek()是不触发流处理管道的中间操作。您应该只有一个终端操作来触发流处理管道。流本质上是惰性的,因此如果没有一个终端操作,它就不会被触发。因此,在您的管道中添加一名终端操作员,看看您需要什么。这是一种方法。


long matchCount = numbers.stream().filter(x -> x >= 5)

    .peek(x -> System.out.println("peek at: " + x))

    .count();


查看完整回答
反对 回复 2021-10-20
?
青春有我

TA贡献1784条经验 获得超8个赞

引用Stream#peek()的 JavaDoc :

返回一个由该流的元素组成的流,另外在每个元素上执行提供的操作,因为元素从结果流中被消耗。

这是一个中间操作。

有关这方面的更多信息可以在文档中找到但为了完整起见:

中间操作返回一个新的流。他们总是很懒惰;执行诸如 filter() 之类的中间操作实际上并不执行任何过滤,而是创建一个新流,该流在遍历时包含与给定谓词匹配的初始流的元素。管道源的遍历直到管道的终端操作被执行后才开始。


查看完整回答
反对 回复 2021-10-20
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

    如上所述,流是惰性的。这意味着没有终止操作就不会开始计算。你可以forEach()在你的例子中使用。替换peek为forEach将开始计算:


     List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);

     numbers

                    .stream()

                    .filter(x -> x >= 5)

                    .forEach(x-> System.out.print("x: " + x));


查看完整回答
反对 回复 2021-10-20
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信