【问题标题】:Is it possible to iterate through a array in lambda expressions? (java)是否可以遍历 lambda 表达式中的数组? (爪哇)
【发布时间】:2019-10-24 14:38:57
【问题描述】:

我需要为每个分区创建一个新的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 表达式引用的局部变量必须是 final 或有效 final

【问题讨论】:

  • 我没有看到任何循环。并且错误消息是关于 sum,如消息所述,您无法从 lambda 进行修改。

标签: java arrays lambda


【解决方案1】:

您正在向您的ForkJoinPool 提供Runnable lambda。 因此,您无法使用所需的数组块对其进行参数化。

您实际上应该定义一个扩展RecursiveTask<Double> 的类,其构造函数将数组块作为参数,并决定是对整个块进行操作还是在它太大时分叉。

然后使用 ForkJoinPoolinvoke 方法获得最终计算的结果,方法是向其传递一个新的 RecursiveTask<Double> 实例,获取整个数组(任务将根据您的标准决定是否一次完成所有事情,或者将数组的一半元素分叉到另一个任务并稍后加入)。

注意,因为这里有些混乱。

如果事实上,您不需要需要利用 fork/join 框架并且只想异步执行您的操作,那么在没有ForkJoinPool 的情况下有很多方法可以做到这一点。 p>

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2014-09-12
    相关资源
    最近更新 更多