首页 > 解决方案 > 流 peek() 方法行为

问题描述

List<Integer> nums = Arrays.asList(1,2,3,4,5,6);
long result = nums
        .stream()
        .peek(System.out::print)
        .map(n->n*n)
        .filter(n->n>20)
        .peek(System.out::print)
        .count();
System.out.println(result);     

为什么不应该打印12345625362而不是打印1234525362

标签: javajava-8java-stream

解决方案


如果我们在 println 中添加空格,peek我们可以更好地了解为什么会发生这种情况:

long result2 = nums.stream()
                   .peek(e -> System.out.print(e + " "))
                   .map(n->n*n)
                   .filter(n->n>20)
                   .peek(e -> System.out.print(e + " "))
                   .count();

这输出:

1 2 3 4 5 25 6 36 

如您所见1,通过,打印出来,没有通过过滤器,因此没有打印正方形。2,3和也是如此4。然后5通过,并被打印。它通过过滤器,因此25被打印。到目前为止,我们有:

1 2 3 4 5 25

然后六个以类似的方式通过,我们剩下

1 2 3 4 5 25 6 36 

然后System.out.println(result);被打印出来。由于最后一次调用是 toprint而不是println它打印在同一行,所以 a2被附加。如果我们取出空格,则会产生:

12345256362

结果是什么


推荐阅读