Java流,有和没有forEach的区别

时间:2016-06-25 07:05:48

标签: java java-stream

(*) forEach和没有?之间有什么区别?什么是输出,为什么?我知道没有forEach什么都不打印......但是为什么需要偷看呢?

正如我所知道的peek你必须对System.out.println的结果流做一些事情......但是它似乎没有在这里完成,它仍然运行....

public class NaturalNumbers
       implements Supplier<Integer> {
 private int i = 0;
 public Integer get() { return ++i; }
}

public static void main(String[] args) {
 Stream<Integer> s =
                Stream.generate(new NaturalNumbers());

 s.limit(5)
  .peek( System.out::println )
  .forEach( System.out::println );/// ׂ (*)
{

2 个答案:

答案 0 :(得分:2)

peek只是在流中 peek 的一种方式,它不会改变它,但是peek中的函数将接收流中的所有元素。

forEach是一个终端操作,它将使用流中的所有数据并返回void

上述代码的结果将是每个数字打印两次,当您删除peek时,您将只打印一次数字。

如果删除forEach,则不会获得任何输出,因为在遇到终端操作(例如forEachcount)之前,流不会执行操作。

答案 1 :(得分:2)

有终端和中间操作的概念。 终端操作是最后一步 - 它们会导致所有中间操作被处理。 Peek不是终端操作。

Stream.of("one", "two", "three", "four")
          .filter(e -> e.length() > 3)
          .peek(e -> System.out.println("Filtered value: " + e))
          .map(String::toUpperCase)
          .peek(e -> System.out.println("Mapped value: " + e))
          .collect(Collectors.toList());

是的,我建议你查看方法peek的javadocs: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

另外,请阅读本文档 https://docs.oracle.com/javase/tutorial/collections/streams/

如何知道方法是终端操作还是中间操作?很简单,因为它可以 - 中间操作总是返回Stream类,而终端操作可以返回各种不同的对象 - 可选类,一些集合,基元等。