Java流“forEach”但不消耗流

有时,在处理流的步骤之间对流中的每个元素进行“某事”(例如打印)将是方便的,例如用于调试。

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

 List list = new ArrayList(); list.add("one"); list.add("two"); list.add("three"); list.add("four"); List filteredList = list.stream() .filter(s -> s.startsWith("t")) .forEach(System.out::println) .collect(Collectors.toList()); 

怎么能实现这一目标?

您正在寻找peek操作:

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

此方法将在Stream管道消耗时对Stream管道的所有元素执行给定操作。 因此,它允许窥视元素。

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