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

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

someStreamableResource.stream().whatever()

但是,然后,相当多的“流媒体资源”也有了.parallelStream()

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

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

我的直觉是,事实上,Stream是默认设置为并行还是完全并行是由其底层Spliterator指导的。

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

参考方案

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

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

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

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

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

检查Optional中是否存在null属性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

Java 8流:处理空值 - java

以下代码为属性Salary为null抛出NPE。class Person具有以下属性:字符串:name,整数:age,整数:薪金salary在此处可以为null。我想创建一份工资清单。persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())在这里,…

Java 8 Stream从过滤结果中获取对象 - java

注意:我不知道我的标题是否正确,所以请随时将其更改为更合适的名称,因为Java 8的术语是我的新手。问题:我有一些对象A,我想根据它持有的数值(例如整数)对其进行过滤。我想找到具有最高值的对象,然后返回该对象。使用流如何完成?public SomeObject getObjectWithHighestValue() { int max = Integer.M…

Java 8根据条件应用流过滤器 - java

在Java 8中,有一种方法可以根据条件将过滤器应用于流,例我有这个流if (isAccessDisplayEnabled) { src = (List < Source > ) sourceMeta.getAllSources.parallelStream() .filter(k - > isAccessDisplayEnabled((S…