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
发布于 2019-04-08 04:37:33
如果我们在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这就是结果
发布于 2019-04-08 04:34:38
所有流操作首先应用于1,首先是peek / print,然后是map,然后是filter,删除元素。同样的事情发生在2,3和4上。之后的输出是1 2 3 4。
然后对于5,我们peek / print,然后是map,filter,让元素保持机智,然后是peek / print平方数。输出5 25
6也是这样。输出:6 36。
All All 1234 525 636 -> 1234525636 (All All All636->1234525636)
然后是count的最终2。
https://stackoverflow.com/questions/55563372
复制相似问题