Java流" forEach"但不消耗流

时间:2016-02-12 14:17:14

标签: java lambda java-8 java-stream

有时它会很方便吗"某事" (例如,打印)在处理流的步骤之间的流中的每个元素,例如,用于调试。

一个简单的示例可能看起来像这样,不幸的是,这不起作用,因为forEach使用了流:

List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");

List<String> filteredList = 
        list.stream()
        .filter(s -> s.startsWith("t"))
        .forEach(System.out::println)
        .collect(Collectors.toList());

如何实现这一目标?

1 个答案:

答案 0 :(得分:15)

您正在寻找peek操作:

  

此方法主要用于支持调试,您希望在元素流经管道中的某个点时查看元素

此方法将在Stream管道使用时对Stream管道的所有元素执行给定操作。因此,它允许采用peek个元素。

List<String> filteredList = 
    list.stream()
        .filter(s -> s.startsWith("t"))
        .peek(System.out::println)
        .collect(Collectors.toList());