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

我需要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;

    }

例外:从 lambda 表达式引用的局部变量必须是最终的或实际上最终的


FFIVE
浏览 113回答 1
1回答

米脂

您正在Runnable向您的ForkJoinPool. 因此,您无法使用所需的数组块对其进行参数化。您实际上应该定义一个扩展类RecursiveTask<Double>,其构造函数将数组块作为参数,并决定是对整个数组进行操作还是在数组太大时进行分叉。然后使用invoke您的方法ForkJoinPool来获取最终计算的结果,通过向其传递一个RecursiveTask<Double>采用整个数组的新实例(任务将根据您的标准决定是一次性完成所有操作还是分叉,例如,数组元素的一半转移到另一个任务并稍后加入)。请注意,这里有些混乱。事实上,如果您不需要利用 fork/join 框架而只想异步执行操作,那么有很多方法可以在不使用ForkJoinPool.例如:Callable<Double> call&nbsp; = () -> {return Arrays.stream(input).sum();};Future<Double> future =&nbsp; Executors.newSingleThreadExecutor().submit(call);// when you're readyDouble sum = future.get();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java