当前位置: 首页 > 知识库问答 >
问题:

stream.foreach()总是并行工作吗?

邵骏喆
2023-03-14

在使用流进行聚合时,Brian Goetz将使用stream.collect()填充集合与使用stream.foreach()进行相同的操作进行了比较,其中有以下两个片段:

Set<String> uniqueStrings = strings.stream()
                                   .collect(HashSet::new,
                                            HashSet::add,
                                            HashSet::addAll);
Set<String> set = new HashSet<>();
strings.stream().forEach(s -> set.add(s));

根据我的理解,只有在流是并行的情况下,多个线程才能在forEach()中工作。但是,在给出的示例中,forEach()是在一个顺序流上操作的(没有调用parallelStream())。

那么,是forEach()总是并行工作,还是代码段应该调用parallelStream()而不是stream()。(或者说我错过了什么?)

共有1个答案

唐弘和
2023-03-14

不,如果流不并行,则forEach()不会并行化。我想他是为了讨论而简化了这个例子。

作为证据,这段代码位于AbstractPipeline类的evaluate方法(从forEach调用)内部

 return isParallel()
               ? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags()))
               : terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));
 类似资料:
  • 我目前使用的是Xcode 8.3.3,如果我使用的是UIWebView,我会遇到这个错误,您可以在下面看到,然后在某些项目中或某些时候WebView不工作,而在其他项目中它会工作。我已经用一个空项目对它进行了测试,是的,是UIWebView导致了这些问题。 objc[11182]:类PLBuildVersion在/Applications/xcode . app/Contents/Develope

  • 为什么?是否有其他方法将消息文本附加到TextAres,也许使用绑定?

  • 我已经尝试了一段时间让smoothScrollToPositionFromTop()工作,但它并不总是滚动到正确的位置。 我有一个ListView(有10个条目)的布局,边上有10个按钮,所以我可以滚动到列表中的每个条目。通常,当我向后或向前滚动一个位置时,效果很好,但是当我试图向后或向前滚动超过3个位置时,ListView并不完全在所选位置结束。当它失败时,它通常会减少0.5到1.5个项目,并且

  • 我试着用Google Location API在地图中定义地理位置,我使用genymotion和Lockito的智能位置库togheter来测试我的地理信息,但当我开始Lockito测试时,我的IntentService捕捉到了谷歌地理信息事件,错误代码为1000,在谷歌API for Android文档中,这意味着地理信息不可用错误,我使用genymotion和我的Moto G3进行测试,但结果

  • 问题内容: 假设我有以下代码: 输出是相同的线程名称,因此这里没有任何好处-我的意思是,只有一个线程可以完成所有工作。 里面是这段代码: 我知道如果“外部”流是并行的(可能会阻塞),则强制该属性,“外部”将不得不等待“ flatMap”完成,反之亦然(因为使用了相同的公共池),但是为什么 总是 强迫那个? 那是在以后的版本中 可能会 更改的事情之一吗? 问题答案: 有两个不同方面。 首先,只有一个