【问题标题】:Using lambda expression inside a loop is giving me an error,how do I resolve this?在循环中使用 lambda 表达式给我一个错误,我该如何解决这个问题?
【发布时间】:2020-09-12 23:55:43
【问题描述】:
    while(flag==false){
        loc=Collections.min(sticks);
        result[k++]=sticks.size();
        sticks.removeIf(f -> (f==loc));
        sticks.replaceAll(g ->(g-loc));        
    }

Solution.java:24:错误:从 lambda 表达式引用的局部变量必须是最终的或有效的最终

             sticks.removeIf(f -> (f==loc));

Solution.java:25:错误:从 lambda 表达式引用的局部变量必须是最终的或有效的最终

            sticks.replaceAll(g ->(g-loc));        

【问题讨论】:

  • 在循环内定义 loc。
  • 你的edit刚刚完全改变了错误信息。
  • loc变量的类型是什么?
  • loc 是一个被初始化为 0 的整数。
  • 你不应该写像flag==false这样的表达式;惯用形式是! flag。但无论如何,由于flag 在此循环中从未更改,但您反复从没有无限容量的集合中删除,此循环条件看起来像是一个等待发生的错误。如果这段代码应该一直运行到列表为空,那么sticks.replaceAll(g ->(g-loc)); 就完全过时了。即使您打算使用非空集合退出循环,在最后一个 loc 结束时执行一次 sticks.replaceAll(g -> g-loc); 就足够了。

标签: java list loops arraylist methods


【解决方案1】:

你必须确保'loc'变量在声明后永远不会改变。

这将起作用:

  while(flag==false){
    int loc=Collections.min(sticks);
    result[k++]=sticks.size();
    sticks.removeIf(f -> (f==loc));
    sticks.replaceAll(g ->(g-loc));        
  }

这不会:

  int loc = -1;
  while(flag==false){
    loc=Collections.min(sticks);
    result[k++]=sticks.size();
    sticks.removeIf(f -> (f==loc));
    sticks.replaceAll(g ->(g-loc));        
  }

编译器不知道什么时候会执行 lambda,所以它需要能够在编译时知道如何解析所有变量。

在第一种情况下, loc 变量只分配一次,因此编译器可以使用它来链接。第二种情况,同一个loc变量被多次赋值,编译器无法编译lambda函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多