提问者:小点点

foreach和.stream()之间的区别是什么。foreach?[副本]


这是一个例子:代码A:

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

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

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

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


共3个答案

匿名用户

实际上,它们基本上是相同的,但有一点语义上的差异。

代码A由Iterable.for每个定义,而代码B由Stream.for每个定义。Stream.for每个的定义允许以任何顺序处理元素——即使是顺序流。(对于并行流,Stream.for每个很可能会乱序处理元素。)

Iterable.for每个都从源代码中获取一个迭代器,并在其上调用forEachRem”()。据我所知,的所有当前(JDK 8)实现Stream.for集合类上的每个都将创建一个从源代码的迭代器之一构建的拆分器,然后将在该迭代器上调用forEachRem”,就像Iterable.for每个一样。所以他们做同样的事情,尽管流版本有一些额外的设置开销。

然而,在未来,streams实现可能会发生变化,因此不再是这种情况。

(如果您想保证处理流元素的顺序,请改用forEachOr的()。)

匿名用户

语义学方面没有区别,尽管没有stream的直接实现可能效率稍高。

匿名用户

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

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

和终端操作(for每,最大,计数,匹配任何,findFirst,减少,收集,总和,find任何)产生一个对象,这不是一个流。

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