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

这是一个例子:代码A:

files.forEach(f -> { //TODO }); 

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

 files.stream().forEach(f -> { }); 

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

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

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

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

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

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

虽然没有stream的直接实现可能稍微有效,但语义方面没有区别。

流是用于耗尽操作或迭代的元素序列(即数据结构)。 任何集合都可以作为流公开。 您在流上执行的操作可以是

中间操作 (map,skip,concat,substream,distinct,filter,sorted,limit,peek ..)生成另一个java.util.stream.Stream但是中间操作是延迟操作,只有在终端操作之后才会执行执行。

终端操作 (forEach,max,count,matchAny,findFirst,reduce,collect,sum,findAny)生成一个非流的对象。

基本上它与Unix中的管道类似。

两种方法都使用终端操作Iterable.forEach ,但带有.stream()的版本也不必要地创建表示List的Stream对象。 虽然没有区别,但它并不是最理想的。