Java SQL Lambda将for循环变量添加到对象
我正在创建一个程序,该程序在对象之间循环,并根据循环到达的迭代更改团队变量,但是get“从lambda表达式引用的局部变量必须是final或实际上是final”错误。有人能提出解决办法吗Java SQL Lambda将for循环变量添加到对象,java,lambda,Java,Lambda,我正在创建一个程序,该程序在对象之间循环,并根据循环到达的迭代更改团队变量,但是get“从lambda表达式引用的局部变量必须是final或实际上是final”错误。有人能提出解决办法吗 for(int i=1; i<11; i++){ ObjectList.stream() .filter(Student -> Student.getRole().equals("Design")) .filter(Student ->
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);
});
}
for(int i=1;i Student.getRole().equals(“设计”))
.filter(Student->Student.getTeam()==0)
.forEach(学生->{
学生:塞塔姆(我);
系统输出打印(学生);
});
}
这似乎非常浪费cpu。
afaict,您正在为每个拥有团队0的设计专业学生设置唯一且递增的团队id
对于您的问题,您可以随时复制“i”,如中所示:
final int teamId = i;
然后使用seteam(teamId)
一个更简单的方法(如果你真的不能编写for循环,必须使用streams…)是
好的老阵法拳击技巧:)它看起来有点难看,但是非常有用!(+1)@RannLifshitz,数组ref技巧即使对我来说也不太流行,因为它不可挥发。我本可以使用一个过度杀戮的atomicinteger,但它会引发更多的问题…一个简单的类可以做到:MutableInteger{volatile int value;}。@user2023577:我还使用了volatile和原子原语。当必须处理具有接点精度的同步时,它们是一个很好的工具。谢谢你把他们带到讨论中来。
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);
});