当前位置: 首页 > 面试题库 >

Java 8`Stream`可以并行运行,甚至不需要您吗?

曹子平
2023-03-14
问题内容

如我所见,使用Java 8时,显而易见的代码Stream无论是“对象”流还是原始流(即IntStream和朋友),都将仅使用:

someStreamableResource.stream().whatever()

但随后,也有不少“可流动资源” .parallelStream()

读取javadoc时不清楚的是.stream()流是否始终是顺序的,以及.parallelStream()流是否始终是并行的…

然后是Spliterator尤其是它.characteristics()之一,它可以是CONCURRENT甚至是它IMMUTABLE

我的直觉是,事实上,无论a是否Stream可以默认并行,还是完全并行,都是由其底层Spliterator

我在正确的轨道上吗?我已经阅读并再次阅读了javadocs,但仍然无法对这个问题给出明确的答案…


问题答案:

首先,通过 规格
的镜头。流是并行还是顺序是流状态的一部分。流创建方法应指定它们是创建顺序流还是并行流(在JDK中大多数都是这样做的),但是不必这么说。如果您的信息流来源没有说,请不要假设。如果有人向您传递信息流,请不要假设。

允许并行流自行决定是否退回到顺序(由于顺序实现 并行实现,因此可能是一个不完善的实现);相反是不正确的。

现在,通过 实施
的视角。在Collections和其他JDK类的流创建方法中,我们遵循“除非用户明确要求并行性,否则创建顺序流”的原则。(但是,其他库会做出不同的选择。如果它们有礼貌,它们会指定其行为。)

流并行性和分离器之间的关系仅是一个方向。拆分器可以拒绝拆分-有效地拒绝任何并行性-但它不能 要求
客户端拆分它。因此,不合作的分离器可能会破坏并行性,但不能确定并行度。



 类似资料:
  • 我现在能够在运行在Websphere服务器上的Java EE项目中自动进行增量编译。 我整理jRebel是因为我在突然启动服务器时遇到了问题,并且注意到现在Intellij正在自动编译,我也能够“几乎”有效地看到更改(比Eclipse慢) 那么,intellij中甚至需要jRebel吗?我对Websphere的设置可以在下图中看到。注意,我只添加了一个Ear文件,它不是分解版本,仍然这是工作。jr

  • 问题内容: 因此,我们有一个页面: 并想添加一些点击事件: 奇迹般有效!但是,当您将第二个参数设为外部函数时: 它立即调用该函数。我该如何阻止! 问题答案: 由于第二个参数需要函数 引用 ,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其 结果(这是因为,因为该函数所做的全部是且不返回任何内容)。在匿名函数中调用该函数(如您的第一个示例),或者更改该函数以返回一个函数。

  • 在重新部署我的应用程序和重新启动我的服务器之前,Sunsports Solr停止了,不能再启动了,尽管它在重新部署重新启动之前是工作的。当我奔跑时 我收到以下 但是java-version返回以下内容: 不知道该怎么办了,已经尝试从应用程序中删除solr文件夹,并再次运行安装(rails gsunspot_solr:安装),但没有幸运... 我使用的是Ruby 2.0.0 Rails 4.0.0。

  • 我试图让一个任务在Windows调度程序运行每10分钟。 下图中有两条蓝线,这只是一个任务,但我在刷新页面后的不同时间截图了它们。 正如您可以在图像任务调度器中看到的,在最后运行时间下的底部蓝线上显示为下午3:37,下一个运行时间为下午5:02。然后在顶部蓝线上,我在下午5:02之后有一个相同任务的屏幕截图,它没有更新上一次运行时间,但它将下一次运行时间向前推了10分钟。 如果我右键单击任务并手动

  • 在Netbeans中,经过一些研究,我成功地编辑了文件构建。xml来定制IDE生成jar和清单文件的方式。我不得不为Eclipse迁移一个项目,甚至找到了构建jar的选项,但我需要用一些个性化信息构建jar。 我添加了文件构建。xml在我的eclipse项目中作为构建文件ANT,但当我发送并执行它时,eclipse运行两次,一次生成2个jars文件。 遵循我的文件构建。xml: 需要指出的是,ec

  • 刚刚在Yosemite上安装了一个新版本的Kepler 64bit“面向Java开发人员”,在第一次启动时就出现了这个错误。有什么办法解决吗?真的不想降级我的Java版本!