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
?
答案 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
经过,被打印出来,没有通过过滤器,因此正方形没有被打印。 2
,3
和4
也是如此。然后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
,然后依次应用于map
和filter
,从而删除该元素。 2、3和4发生相同的事情。随后的输出为1
2
3
4
。
然后用5依次peek
/ print
,然后map
,filter
使元素保持完好无损,然后peek
/ print
平方数。输出5
25
与6相同。输出:6
36
。
一起1234
525
636
-> 1234525636
然后是2
的最后一个count
。