.foreach和.stream()之间的区别是什么?foreach?

min*_*ing 12 java lambda java-8 java-stream

这是一个例子:代码A:

files.forEach(f -> {
    //TODO
});
Run Code Online (Sandbox Code Playgroud)

和另一个代码B可以这样使用:

files.stream().forEach(f -> { });
Run Code Online (Sandbox Code Playgroud)

两者之间有什么区别,有stream()没有stream()

Stu*_*rks 22

实际上,它们大多是相同的,但存在一个小的语义差异.

代码A由定义Iterable.forEach,而代码B由定义Stream.forEach.Stream.forEach允许以任何顺序处理元素的定义- 即使对于顺序流也是如此.(对于并行流,Stream.forEach很可能会无序处理元素.)

Iterable.forEach从源获取Iterator并调用forEachRemaining()它.据我所知,Stream.forEach集合类的所有当前(JDK 8)实现都将创建一个源自其中一个迭代器的Spliterator,然后将调用forEachRemaining该迭代器 - 就像Iterable.forEach那样.所以他们做同样的事情,虽然流版本有一些额外的设置开销.

但是,在将来,流实现可能会发生变化,因此不再是这种情况.

(如果要保证处理流元素的排序,请forEachOrdered()改用.)

  • 令人惊讶的是,Iterable.forEach的default实现没有在Iterator上调用forEachRemaining。它使用for-each循环进行迭代。默认的Stream.forEach将在Spliterator上调用forEachRemaining,最终将调用Iterator.forEachRemaining,除非Iterable.spliterator()被覆盖(大多数JRE提供的Collection都这样做)。因此,即使对于collection.forEach(...)和collection.stream()。forEach(...)基本上相同的Collection,它们最终也会以不同的代码来完成。但是对于某些`Collection`来说,有很大的不同。 (3认同)
  • `Vector` 和 `Collections.synchronized...` 方法返回的集合存在显着差异,因为它们的 `forEach` 实现将被 `synchronized` 而调用 `stream().forEach(...)` 需要手动同步。 (2认同)

Lou*_*man 2

在语义方面没有区别,尽管直接实现可能stream会稍微更有效。