java 8 中的 parallelStream() 是否保证顺序?

Bee*_*Bee 4 java-8 java-stream

我试图了解parallelStream()java 8 中的行为。这是我的示例代码。

List<Person> javaProgrammers = new ArrayList<Person>() {
    {
        add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
        add(new Person("Tamsen", "Brittany", "Java programmer", "female", 33, 1500));
        add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
        add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
        add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
        add(new Person("Maude", "Jaimie", "Java programmer", "female", 33, 1900));
        add(new Person("Shawn", "Randall", "Java programmer", "male", 33, 2300));
        add(new Person("Jayden", "Corrina", "Java programmer", "female", 33, 1700));
        add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
        add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
    }
};

System.out.println("Serial:" + javaProgrammers.stream().filter(person -> person.age == 33).findFirst().toString());
System.out.println("Parallel:" + javaProgrammers.parallelStream().filter(person -> person.age == 33).findFirst().toString());
Run Code Online (Sandbox Code Playgroud)

在这里,我正在比较stream()and parallelStream(),我希望Brittany Tamsen总是在stream()通话中返回,因为这是第一场比赛。但是因为parallelStream()我不希望总是Brittany Tamsen返回,因为它可以是任何匹配项之一,因为我希望它并行运行。

但问题是它也Brittany Tamsen 总是返回。所以它看起来不像是并行运行的。

我在这里错过了什么吗?

JB *_*zet 5

除了 Bohemian 的答案之外,重要的是要补充一点,是的,findFirst()将返回匹配谓词的第一个元素,无论流是否并行,因为在这种情况下流具有遇到顺序(从列表创建)。

findAny(),相反,可以自由地返回与谓词匹配的任何元素(因此,如果您并不真正关心返回哪个匹配元素,则应该是首选,因为它可能允许在并行流的情况下更快地返回)。


the*_*472 5

包文档中有整整一段是关于排序的,另一段是并发和排序之间的交互。

摘录(强烈建议阅读其余部分):

流可能有也可能没有定义的相遇顺序。流是否具有遇到顺序取决于源和中间操作。某些流源(例如列表或数组)是内在有序的

然后findFirst文档本身引用了上面定义的遭遇顺序概念。

返回描述此流的第一个元素的 Optional,如果流为空,则返回空的 Optional。如果流没有遇到顺序,则可以返回任何元素。

Spliterator收藏家的文档还描述了一些相关的排序为并行数据流的更复杂的使用行为。