当前位置: 首页 > 知识库问答 >
问题:

Java流“forEach”,但不使用流

贺兴平
2023-03-14

有时,在处理流的两个步骤之间对流中的每个元素进行“处理”(例如打印)会很方便,例如调试。

一个简单的例子可能是这样的,不幸的是,这不起作用,因为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个答案

萧焱
2023-03-14

您正在寻找peek操作:

此方法的存在主要是为了支持调试,在调试中,当元素流过管道中的某一点时,您希望看到它们

此方法将在流管道的所有元素被消耗时对其执行给定的操作。因此,它允许查看元素

List<String> filteredList = 
    list.stream()
        .filter(s -> s.startsWith("t"))
        .peek(System.out::println)
        .collect(Collectors.toList());
 类似资料:
  • 问题内容: 我想做的事情显示在下面的2个流调用中。我想根据某种条件将一个集合分成2个新集合。理想情况下,我想在1中做到这一点。我已经看到了流的.map函数所使用的条件,但是forEach找不到任何东西。实现我想要的最好的方法是什么? 问题答案: 只需将条件放入lambda本身,例如 当然,这假设两个集合(和)在上述代码之前都已声明和初始化。 更新:如JornVernee所建议的那样,使用可以使代码

  • 问题内容: 我在Java 8 foreach流中尝试循环移动下一个项目时遇到问题。我无法将命令设置为,但只能工作,但是在这种情况下,您将退出循环。我需要继续循环下一个项目。我怎样才能做到这一点? 示例(不起作用): 示例(工作): 问题答案: 使用就可以了。这不会阻止完整循环的完成。它将仅停止执行循环的当前迭代。 试试下面的小程序: 输出: 一个 ç 请注意,如何为迭代执行,但是可以在后续迭代中打

  • 我有一个用于列表的for循环,它检查数据库中是否存在索引值。

  • 问题内容: 假设我们尝试将可能引发检查异常的lambda应用于Java 8流: 这不会编译。 一种解决方法是将检查后的异常嵌套在其中,但是这会使以后的异常处理变得复杂,而且很丑陋: 另一种解决方法可能是转换限制功能,以普通的旧的foreach 循环是比较友好的检查的异常。 但是幼稚的方法失败了: 更新资料 为何在的地方贴了一个回答该问题的技巧。作为副答案本身并不能真正回答该问题。我认为这不足以使这

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个