流peek()方法行为

时间:2019-04-07 20:26:43

标签: java java-8 java-stream

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

2 个答案:

答案 0 :(得分:5)

如果我们在peek的println内添加空格,则可以更好地了解发生这种情况的原因:

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经过,被打印出来,没有通过过滤器,因此正方形没有被打印。 234也是如此。然后5经过并被打印。它通过了过滤器,因此打印了25。到目前为止,我们有:

1 2 3 4 5 25

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

1 2 3 4 5 25 6 36 

然后打印System.out.println(result);。由于最后一次调用是print而不是println,因此它被打印在同一行上,因此附加了2。如果我们取出空格,将产生:

12345256362

哪个是结果

答案 1 :(得分:1)

所有流操作首先应用于1,首先应用于peek / print,然后依次应用于mapfilter,从而删除该元素。 2、3和4发生相同的事情。随后的输出为1 2 3 4

然后用5依次peek / print,然后mapfilter使元素保持完好无损,然后peek / print平方数。输出5 25

与6相同。输出:6 36

一起1234 525 636-> 1234525636

然后是2的最后一个count