JDK8EA现在出来了,我只是试着适应lambda和新的Stream。我尝试用并行流对列表进行排序,但结果总是错误的:
import java.util.ArrayList;
import java.util.List;
public class Test
{
public static void main(String[] args)
{
List<String> list = new ArrayList<>();
list.add("C");
list.add("H");
list.add("A");
list.add("A");
list.add("B");
list.add("F");
list.add("");
list.parallelStream() // in parallel, not just concurrently!
.filter(s -> !s.isEmpty()) // remove empty strings
.distinct() // remove duplicates
.sorted() // sort them
.forEach(s -> System.out.println(s)); // print each item
}
}输出:
C
F
B
H
A注意,每次输出是不同的。我的问题是,这是个窃听器吗?还是不可能并行排序一个列表?如果是这样的话,那么为什么JavaDoc不声明呢?最后一个问题,是否有另一个操作的输出会因流类型不同而有所不同?
发布于 2013-10-22 23:25:50
您需要使用forEachOrdered,而不是forEach。
根据forEach文档:
对于并行流管道,此操作并不保证尊重流的遭遇顺序,因为这样做将牺牲并行性的好处。对于任何给定的元素,操作可以在库选择的任何时间和线程中执行。如果操作访问共享状态,则负责提供所需的同步。
发布于 2015-02-25 14:05:06
此外,您还可以通过来自forEachOrdered的一个非常好的例子来阅读更多关于并行性和这里的内容。总之,在并行流中使用forEachOrdered可能会失去并行性的好处。
在这里,来自同一个资源的示例:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers =
new ArrayList<>(Arrays.asList(intArray));
System.out.println("listOfIntegers:");
listOfIntegers
.stream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("listOfIntegers sorted in reverse order:");
Comparator<Integer> normal = Integer::compare;
Comparator<Integer> reversed = normal.reversed();
Collections.sort(listOfIntegers, reversed);
listOfIntegers
.stream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("Parallel stream");
listOfIntegers
.parallelStream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("Another parallel stream:");
listOfIntegers
.parallelStream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("With forEachOrdered:");
listOfIntegers
.parallelStream()
.forEachOrdered(e -> System.out.print(e + " "));
System.out.println("");输出是
listOfIntegers:
1 2 3 4 5 6 7 8
listOfIntegers sorted in reverse order:
8 7 6 5 4 3 2 1
Parallel stream:
3 4 1 6 2 5 7 8
Another parallel stream:
6 3 1 5 7 8 4 2
With forEachOrdered:
8 7 6 5 4 3 2 1第五个管道使用forEachOrdered方法,它按照源指定的顺序处理流的元素,而不管您是以串行方式还是并行方式执行流。请注意,如果在并行流中使用像forEachOrdered这样的操作,则可能会失去并行性的好处。
。
https://stackoverflow.com/questions/19529982
复制相似问题