是否可以利用 Stream API 提供的并行性来调用固定数量的相互独立的方法?
Is it possible to use the parallelism provided by the Stream API to call a fixed number of mutually independent methods?
我有一个 Java class,我在其中使用 Stream
API 提供的并行性。这很好地满足了我的目的,因为我的大部分数据输入都是流。然而,有一个地方的代码是这样的:
void aMethod() {
double[] a = methodA();
double[] b = methodB();
double[] c = methodC();
doSomething(a, b, c);
}
doSomething(double[] a, double[] b, double[] c) {
// concatenates the three arrays, converts to parallel stream, and does stuff
}
对methodA
、methodB
和methodC
的三个调用可以并发。有没有办法并行使用 Stream
API 这些 运行?
您可以轻松创建(并行)方法引用流,充当 Supplier
个 double[]
数组。然后可以将这些映射到它们的 return 值,并收集到一个列表中。粗略画在这里:
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ParallelStreamMethods {
public static void main(String[] args) {
Stream<Supplier<double[]>> s = Stream.of(
ParallelStreamMethods::methodA,
ParallelStreamMethods::methodB,
ParallelStreamMethods::methodC);
List<double[]> result =
s.parallel().map(r -> r.get()).collect(Collectors.toList());
doSomething(result.get(0), result.get(1), result.get(2));
}
private static double[] methodA() {
return getValues("methodA");
}
private static double[] methodB() {
return getValues("methodB");
}
private static double[] methodC() {
return getValues("methodC");
}
private static double[] getValues(String name) {
System.out.println("Enter "+name);
try {
int n = 1000 + (int)(Math.random() * 500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Exit "+name);
return new double[1000];
}
private static void doSomething(double[] a, double[] b, double[] c) {
System.out.println("Doing something with "+a+", "+b+", "+c);
}
}
请注意,收集器仅用于展示基本思想。根据您打算如何处理结果,这可以以不同的方式解决。然而,评论
// concatenates the three arrays, converts to parallel stream, and does stuff
听起来有点可疑。您可能要考虑使用 DoubleStream
s 而不是数组,然后 flatMap
它们来创建更大的 DoubleStream
.
我有一个 Java class,我在其中使用 Stream
API 提供的并行性。这很好地满足了我的目的,因为我的大部分数据输入都是流。然而,有一个地方的代码是这样的:
void aMethod() {
double[] a = methodA();
double[] b = methodB();
double[] c = methodC();
doSomething(a, b, c);
}
doSomething(double[] a, double[] b, double[] c) {
// concatenates the three arrays, converts to parallel stream, and does stuff
}
对methodA
、methodB
和methodC
的三个调用可以并发。有没有办法并行使用 Stream
API 这些 运行?
您可以轻松创建(并行)方法引用流,充当 Supplier
个 double[]
数组。然后可以将这些映射到它们的 return 值,并收集到一个列表中。粗略画在这里:
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ParallelStreamMethods {
public static void main(String[] args) {
Stream<Supplier<double[]>> s = Stream.of(
ParallelStreamMethods::methodA,
ParallelStreamMethods::methodB,
ParallelStreamMethods::methodC);
List<double[]> result =
s.parallel().map(r -> r.get()).collect(Collectors.toList());
doSomething(result.get(0), result.get(1), result.get(2));
}
private static double[] methodA() {
return getValues("methodA");
}
private static double[] methodB() {
return getValues("methodB");
}
private static double[] methodC() {
return getValues("methodC");
}
private static double[] getValues(String name) {
System.out.println("Enter "+name);
try {
int n = 1000 + (int)(Math.random() * 500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Exit "+name);
return new double[1000];
}
private static void doSomething(double[] a, double[] b, double[] c) {
System.out.println("Doing something with "+a+", "+b+", "+c);
}
}
请注意,收集器仅用于展示基本思想。根据您打算如何处理结果,这可以以不同的方式解决。然而,评论
// concatenates the three arrays, converts to parallel stream, and does stuff
听起来有点可疑。您可能要考虑使用 DoubleStream
s 而不是数组,然后 flatMap
它们来创建更大的 DoubleStream
.