我试图了解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
始终。所以它看起来并不像是并行运行。
我在这里遗漏了什么吗?
答案 0 :(得分:4)
除了波希米亚的答案之外,重要的是,添加它,是的,findFirst()
将返回与谓词匹配的第一个元素,无论流是否并行,因为流在这种情况下有一个遭遇顺序(从List创建)。
findAny()
可以自由地返回与谓词匹配的任何元素(因此,如果您不真正关心返回哪个匹配元素,则应该首选它,因为它可能允许更快返回如果是并行流。)
答案 1 :(得分:4)
在package documentation中有一个关于排序的段落,另一个段落是并发和排序之间的相互作用。
摘录(强烈推荐阅读其余内容):
Streams可能有也可能没有已定义的遭遇顺序。是否 一个流有一个遭遇顺序取决于源和 中间操作。某些流源(例如List或 数组)本质上是有序的
findFirst文档本身会引用上面定义的遭遇顺序概念。
返回描述此流的第一个元素的可选项,或者 empty如果流为空,则为可选。如果流没有遭遇 订单,然后可以返回任何元素。
Spliterator和Collector文档还描述了与并行流的更复杂用法的排序相关的一些行为。