是否可以利用 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
}

methodAmethodBmethodC的三个调用可以并发。有没有办法并行使用 Stream API 这些 运行?

您可以轻松创建(并行)方法引用流,充当 Supplierdouble[] 数组。然后可以将这些映射到它们的 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

听起来有点可疑。您可能要考虑使用 DoubleStreams 而不是数组,然后 flatMap 它们来创建更大的 DoubleStream.