【问题标题】:Interrupted statement in java lambda [duplicate]java lambda中的中断语句[重复]
【发布时间】:2020-07-19 12:07:49
【问题描述】:

我有这个代码

    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 中尝试过这个,但我得到了相同的结果。

【问题讨论】:

  • 您不会收到“在 peek 语句中间”的消息,因为没有“peek 语句”。有一个流操作,您将看到流操作是如何工作的,这正是 peek 的目的。

标签: java lambda collections functional-programming java-stream


【解决方案1】:

你为什么感到惊讶?

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

您的流管道一次消耗一个元素(这是执行终端操作collect() 的结果)。

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

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

唯一通过过滤器的元素是43,结果是

43
After filter 43

当它被消耗时被打印出来。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多