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

在循环中使用lambda表达式会给我一个错误,如何解决这个问题?

公羊安怡
2023-03-14
    while(flag==false){
        loc=Collections.min(sticks);
        result[k++]=sticks.size();
        sticks.removeIf(f -> (f==loc));
        sticks.replaceAll(g ->(g-loc));        
    }

解决方案.java:24:错误:从 lambda 表达式引用的局部变量必须是最终变量或实际上是最终变量

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

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

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

共有1个答案

东门子昂
2023-03-14

你必须确保“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函数

 类似资料:
  • 顺便说一下,我搜索了一下这种情况,我认为我没有使用数组索引或者错误地使用了错误的指针。另外,我在这里看到了同样的问题,但我想知道为什么代码不能工作,然后自己解决这个问题。非常感谢大家的帮助。

  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 这是我的密码。数据库名为socapa。 当我运行项目时,出现下面的错误。 Illumb\Database\QueryException SQLSTATE[42000]:语法错误或访问冲突:1055'socapa。联络。“FirstName”不在组中(SQL:选择,,联系人ID,,课程ID,注册,城市,<代码>状态,<代码>国家,<代码>CampusName,<代码>程序名,<代码>会话ID,<代码

  • 我是Springboot的新手,我通过Sping的教程和“https://spring.io/guides”指南来学习。 现在我试图理解并重做教程:“使用MySQL访问数据” 不幸的是,我在Mavenbuild期间出错: 启动ApplicationContext时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行应用程序。2017-12-07 10:26:42.708错误8100---[m

  • 问题内容: 我试图通过执行程序和可运行程序并行执行100个任务,该任务需要使用循环变量: 我在“我”的语气中a不休- 据我所知,由于每次迭代都会更改循环变量,因此无法使其成为最终变量或有效地成为最终变量。我找到了一个简单的解决方法, 在我看来,这并不是最有效的解决方案,因为每次迭代都要声明一个新变量。有更好的方法吗? 问题答案: 有更好的方法吗? 我对此表示怀疑。您的解决方案对我来说看起来不错,但