使用Java 8和lambdas,可以很容易地将集合作为流进行迭代,并且易于使用并行流.来自docs的两个例子,第二个使用parallelStream:
myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));
myShapesCollection.parallelStream() // <-- This one uses parallel
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));
Run Code Online (Sandbox Code Playgroud)
只要我不关心顺序,使用并行是否总是有益的?人们会认为将更多核心的工作划分得更快.
还有其他考虑因素吗?什么时候应该使用并行流?什么时候应该使用非并行?
(这个问题被要求引发关于如何以及何时使用并行流的讨论,而不是因为我认为总是使用它们是一个好主意.)
我是Java 8的新手.我仍然不深入了解API,但我已经做了一个小的非正式基准测试来比较新Streams API与优秀旧Collections的性能.
测试包括过滤一个列表Integer,并为每个偶数计算平方根并将其存储在结果List中Double.
这是代码:
public static void main(String[] args) {
//Calculating square root of even numbers from 1 to N
int min = 1;
int max = 1000000;
List<Integer> sourceList = new ArrayList<>();
for (int i = min; i < max; i++) {
sourceList.add(i);
}
List<Double> result = new LinkedList<>();
//Collections approach
long t0 = System.nanoTime();
long elapsed = 0;
for (Integer i : sourceList) {
if(i % 2 == 0){
result.add(Math.sqrt(i));
} …Run Code Online (Sandbox Code Playgroud) 据我所知,流比传统的旧编程更快。
但是,当我运行以下代码时,结果出乎我的意料。
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int m = Arrays.stream(a).reduce(Integer.MIN_VALUE, Math::max);
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:22857304
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int e = a.length;
int m = Integer.MIN_VALUE;
for (int i = 0; …Run Code Online (Sandbox Code Playgroud)