java - 是否可以在 lambda 表达式中迭代数组? (java)

标签 java arrays lambda

我需要为每个分区创建一个新的ForkJoinTask,并且不知道如何到达数组中的下一个位置。有人可以帮助我吗?

protected static double parManyTaskArraySum(final double[] input, final int numTasks) {

        double sum = 0;
        // ToDo: Start Calculation with help of ForkJoinPool
        ForkJoinPool fjp = new ForkJoinPool(numTasks);
        fjp.execute(() -> {

            sum+=( 1 / input[???] ); //the problem is here
        });

        return sum;
    }

Exception: local variables referenced from a lambda expression must be final or effectively final

最佳答案

您正在喂养Runnable lambda 到您的 ForkJoinPool 。 因此,您无法使用所需的数组 block 对其进行参数化。

您实际上应该定义一个扩展 RecursiveTask<Double> 的类其构造函数以数组 block 为参数,并决定是否对整个数组进行操作,或者如果数组太大则进行 fork 。

然后使用 invoke你的方法ForkJoinPool通过向其传递 RecursiveTask<Double> 的新实例来获取最终计算的结果获取整个数组(任务将根据您的标准决定是一次性完成所有操作,还是将数组元素的一半 fork 到另一个任务并稍后加入)。

注意,因为这里存在一些困惑。

如果事实上,您不需要需要利用 fork/join 框架而只想异步执行操作,那么有很多方法可以做到这一点,而无需 ForkJoinPool .

例如:

Callable<Double> call  = () -> {return Arrays.stream(input).sum();};
Future<Double> future =  Executors.newSingleThreadExecutor().submit(call);
// when you're ready
Double sum = future.get();

关于java - 是否可以在 lambda 表达式中迭代数组? (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58543737/

相关文章:

java - Android RecyclerView 项目选择问题

java - Jar Store - 防止复制

javascript - 嵌套 for in 循环,不工作 JavaScript

Python "with"Lambda 函数中的关键字

java - 是什么导致 AWT-EventQueue-0 线程中的 NullPointerException

java - 如何修改 XML 文件的元素然后打印整个内容

javascript - 检查数组是否包含另一个数组的所有元素

python - 使用 numpy 或 scipy 将 3D 数据数组拟合到 1D 函数

c# - 将 Lambda 表达式声明为类常量字段

Java8 : convert one map to another map using stream