流peek()方法行为

man*_*aug 2 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);     
Run Code Online (Sandbox Code Playgroud)

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

GBl*_*ett 5

如果我们在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();
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3 4 5 25 6 36 
Run Code Online (Sandbox Code Playgroud)

如您所见1,打印出来了,没有通过过滤器,因此正方形没有被打印出来。同样是真正的234。然后5经过并打印。它通过过滤器,因此25被打印。到目前为止,我们有:

1 2 3 4 5 25
Run Code Online (Sandbox Code Playgroud)

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

1 2 3 4 5 25 6 36 
Run Code Online (Sandbox Code Playgroud)

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

12345256362
Run Code Online (Sandbox Code Playgroud)

结果是什么