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

从lambda表达式引用的局部变量必须是最终的

冯鸿哲
2023-03-14

我正在尝试从pojo创建一个getValue()函数,该函数在以下意义上使用细节类值的求和:

@Transient
public BigDecimal getValue() {
   BigDecimal sum = new BigDecimal(0);

   details.stream().forEach((detail) -> {
      sum = sum.add(detail.getValue());
   });

   return sum;
}

但是不知道为什么这一行< code > sum = sum . add(detail . getvalue());引发此错误:

从lambda表达式引用的局部变量必须是final或有效final

你能告诉我我做错了什么吗?谢了。

共有3个答案

尹庆
2023-03-14

这是我避免循环中最终p的方法,并且奏效了。

public void getSolutionInfo(){      
ArrayList<Node> graph = Main.graph; 

    for(int p=1;p<=Pmax;p++) {          
        final int p2=p;
        System.out.printf("number of node with priority p = %d is %d ",p, graph.stream().filter(node->node.getPriority()==p2).count()); 
    }
樊博雅
2023-03-14

好吧,只是不要在Foreach循环中使用lambda表达式

@Transient
public BigDecimal getValue() {
   BigDecimal sum = new BigDecimal(0);

   for (Detail detail : details) {
      sum = sum.add(detail.getValue());
   }

   return sum;
}
习高格
2023-03-14

不能从lambda内部修改变量。这是不允许你做的事。

你可以把这个方法写成

return details.stream()
    .map(Detail::getValue)
    .reduce(BigDecimal.ZERO, BigDecimal::add);
 类似资料:
  • 我有一个JavaFX 8程序(用于JavaFXPorts交叉平台),几乎可以做我想做的事情,但又短了一步。该程序读取文本文件,对行进行计数以建立随机范围,从该范围中选取一个随机数,然后读取该行以进行显示。 我对java有点陌生,但似乎我是否使用Lambda在中显示下一个随机行,我的

  • 问题内容: 我有一个JavaFX 8程序(用于跨平台的JavaFXPorts),可以完成我想做的事情,但只差了一步。该程序读取一个文本文件,对行进行计数以建立一个随机范围,从该范围中选择一个随机数,然后读取该行以进行显示。 我对Java有点陌生,但是似乎我是否使用Lambda都不显示下一个随机行,我的行期望一个静态值。 有什么想法可以调整我必须在每次按下屏幕按钮时简单显示var readln2的下

  • 我已经将所有代码从ActionEvent移到了一个方法中,但编译器仍然给我相同的错误:“从lambda表达式引用的局部变量必须是final”。 它来自此处的调用: 我如何解决这个问题,你能解释为什么我会遇到这个问题吗?我对编码相当陌生,希望更好地理解它。 这是我的完整程序:

  • 这个程序是我的类的最终赋值,我在弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或实际上是最终的”时遇到了问题。该程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。当我在没有并发的情况下创建它时,我没有这个错误。我正在努力确定在哪里最终确定高变量和低变量。 这是产生错误的代码块。如果我使int高=数字[0];或int-low=数字[0];final,然后我得到一个错误

  • 我试图在中的forloop中更新,因为导致一个新的ComppletableFuture实例,我需要将其重新分配给一个新变量以更新,但我不太确定如何

  • 今天我想做一些我想完成的项目,在那里我得到了一个异常,我不能从lambda表达式中引用局部变量。我有一个方法,其中我给出了两个值,该方法检查值对是否已经在HashMap中 当它结束时,我想读出布尔函数,需要知道他是否发现它成立= false我怎样才能在这个lambda中设置founded或者有没有其他方法可以做到这一点?