【问题标题】:SQL Lambda adding for loop variable to objectSQL Lambda将for循环变量添加到对象
【发布时间】:2018-04-18 22:02:34
【问题描述】:

我正在创建一个程序,该程序循环遍历对象并根据到达的循环迭代更改 Team 变量,但得到“从 lambda 表达式引用的局部变量必须是最终或有效最终”错误。任何人都可以提出解决方法吗?

 for(int i=1; i<11; i++){
      ObjectList.stream()
          .filter(Student -> Student.getRole().equals("Design"))
           .filter(Student -> Student.getTeam() == 0)
          .forEach(Student -> {
              Student.setTeam(i);
          System.out.println(Student);
          });
          }

【问题讨论】:

    标签: java lambda


    【解决方案1】:

    这似乎很浪费cpu。 afaict,您正在为每个拥有团队 0 的设计学生设置一个唯一且递增的团队 ID。

    对于您的问题,您可以随时复制“i”,如下所示:

    final int teamId = i;
    

    然后使用 setTeam(teamId)。

    一个更简单的技巧(如果你真的不能编写 for 循环并且必须使用流......)将是

    final int[] nextId = new int[]{1};
    ObjectList.stream()
            .filter(s -> "Design".equals(s.getRole()) && s.getTeam() == 0)
            .forEach(s -> {
                 s.setTeam(nextId[0]++);
                 System.out.println(s);
             });
    

    【讨论】:

    • 很好的旧数组拳击技巧 :) 它看起来有点难看,但非常有用! (+1)
    • @RannLifshitz,数组引用技巧即使对我来说也不是那么流行,因为它不是 volatile-able。我本可以使用一个矫枉过正的 atomicinteger,但它会引发更多问题......一个简单的类就可以了:MutableInteger {volatile int value;}。
    • @user2023577 :我还使用了 volatile 和 atomic 原语。当必须处理具有精确点精度的同步时,它们是一个很好的工具。很高兴将他们带入讨论。
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多