首页 > 解决方案 > java lambda中的中断语句

问题描述

我有这个代码

    Integer[] i = {1,3,4,6,7,43,2,1};
    //create a predicate
    Predicate<Integer> ini = value -> value > 10;;
    //display-filter-and print the values in the collection
    List<Integer> sss =Stream.of(i).peek(e -> System.out.println(e)).filter(ini).
            peek(value -> System.out.println("After filter " + value)).collect(Collectors.toList());
    //display the filtered list
    System.out.println(sss);

我得到了这个结果

1
3
4
6
7
43
After filter 43
2
1 
[43]

我的问题是为什么我在 peek 语句中间收到过滤器消息?我在不同的 IDE 中尝试过这个,但我得到了相同的结果。

标签: javalambdacollectionsfunctional-programmingjava-stream

解决方案


你为什么惊讶?

您有两个peek()方法调用。第一个在过滤器之前,第二个在过滤器之后。

您的流管道一次消耗一个元素(这是由于执行终端操作而发生的collect())。

使用流的元素涉及应用 first peek(),它打印元素,然后应用过滤器。

只有当元素通过过滤器时,peek()才会应用第二个元素,并打印“过滤后......”。

通过过滤器的唯一元素是 43,这导致

43
After filter 43

被消耗时被打印。

只有稍后剩余的元素才会被消耗,并在第一个元素peek应用于它们时打印。


推荐阅读