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

时间:2016-11-14 06:32:09

标签: java-8 java-stream

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

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());

我在这里比较stream()parallelStream(),我希望Brittany Tamsen始终在stream()来电,因为这是第一场比赛。但是对于parallelStream(),我不希望{strong>总是返回Brittany Tamsen,因为它可以是任何匹配之一,因为我希望它可以并行运行。

但问题是它还会返回Brittany Tamsen 始终。所以它看起来并不像是并行运行。

我在这里遗漏了什么吗?

2 个答案:

答案 0 :(得分:4)

除了波希米亚的答案之外,重要的是,添加它,是的,findFirst()将返回与谓词匹配的第一个元素,无论流是否并行,因为流在这种情况下有一个遭遇顺序(从List创建)。

相反,

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

答案 1 :(得分:4)

package documentation中有一个关于排序的段落,另一个段落是并发和排序之间的相互作用。

摘录(强烈推荐阅读其余内容):

  

Streams可能有也可能没有已定义的遭遇顺序。是否   一个流有一个遭遇顺序取决于源和   中间操作。某些流源(例如List或   数组)本质上是有序的

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

  

返回描述此流的第一个元素的可选项,或者   empty如果流为空,则为可选。如果流没有遭遇   订单,然后可以返回任何元素。

SpliteratorCollector文档还描述了与并行流的更复杂用法的排序相关的一些行为。