为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2023-12-13 10:12:44
我需要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 表达式引用的局部变量必须是最终的或实际上最终的
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

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


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


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


请注意,这里有些混乱。


事实上,如果您不需要利用 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();


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信