当前位置: 首页 > 知识库问答 >
问题:

lambda表达式中有可能遍历一个数组吗?(java)

庄浩言
2023-03-14

我需要为每个部门制作一个新的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

共有1个答案

欧阳俊逸
2023-03-14

您正在向您的< code>ForkJoinPool提供一个< code>Runnable lambda。因此,您不能用所需的数组块对其进行参数化。

您实际上应该定义一个扩展< code>RecursiveTask的类

然后使用ForkJoinPool调用方法通过将该RecursiveTask的新实例传递给它来获得最终计算的结果

请注意,这里存在一些混淆。

如果事实上,您不需要利用fork/join框架,只想异步执行操作,那么有很多方法可以在没有<code>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 8 为 Iterable 接口新增了一个 forEach(Consumer action) 默认方法,该方法所需参数的类型是一个函数式接口,而 Iterable 接口是 Collection 接口的父接口,因此 Collection 集合也可直接调用该方法。 当程序调用 Iterable 的 forEach(Consumer action) 遍历集合元素时,程序会依次将集合元素传给 Co

  • Java 8 为 Iterator 引入了一个 forEachRemaining(Consumer action) 默认方法,该方法所需的 Consumer 参数同样也是函数式接口。当程序调用 Iterator 的 forEachRemaining(Consumer action) 遍历集合元素时,程序会依次将集合元素传给 Consumer 的 accept(T t) 方法(该接口中唯一的抽象方法

  • 问题内容: 有没有那么冗长的替代方案: 我想出了这个: 这节省了一个缩进,但仍然很丑陋。 我希望看起来像这样的伪代码: 有没有类似的东西存在? 问题答案: 我认为您正在寻找ndenumerate。 关于性能。它比列表理解要慢一些。 如果您担心性能,可以通过查看实现来进一步优化,该实现有两件事,转换为数组并循环。如果知道有数组,则可以调用平面迭代器的属性。

  • 问题内容: 说我的数据看起来像这样: 我可以创建一个正则表达式 要将名称,年龄和id匹配到第1组中,将peter,40、99匹配到第2组中。但是,我要迭代甚至选择地遍历这些组。例如, 如果group1值是id,我想进行其他处理。所以算法就像 我想做的第二件事就是跳转到匹配的group1的第三个实例,并获取键“ id”,而不是进行迭代。 问题答案: 使用FindAllStringSubmatch查找

  • 我有一个数组列表,其中包含我想要执行方法“计数”的实例化对象的名称。不过,我不确定是否/如何做到这一点。我有一个循环要扫描数组列表,并添加了伪代码。 我是java新手,不确定这是否可行,但如果有任何帮助,我将不胜感激。谢谢

  • 下面是一个完整的Elm脚本,它将一组元组放入HTML