有时,在处理流的两个步骤之间对流中的每个元素进行“处理”(例如打印)会很方便,例如调试。
一个简单的例子可能是这样的,不幸的是,这不起作用,因为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());
如何做到这一点?
您正在寻找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 循环是比较友好的检查的异常。 但是幼稚的方法失败了: 更新资料 为何在的地方贴了一个回答该问题的技巧。作为副答案本身并不能真正回答该问题。我认为这不足以使这
替代的解决方法可以是将有限的函数转换为对检查的异常更友好的普通旧foreach循环。 但天真的方法是失败的: 更新 回答这个问题的一个技巧以前在Why does stream not implementing iterable 上发布过?作为旁侧答案并不能真正回答问题本身。我认为这不足以将这个问题定性为那个问题的重复,因为他们问的是不同的问题。