我明白这是函数式编程的标准部分..我的问题是为什么编译器不能在lambda语句开始之前自动声明变量的副本为final?Java:为什么java不能在包含lambda表达式的范围中自动“终结”局部变量?
import java.util.stream.IntStream;
public class Example
{
public static void main(String args[])
{
int i = 5;
i = 6;
IntStream.range(0, 10).mapToLong(j-> i * j).sum();
}
}
失败......与“我在封闭范围内定义必须是最后的或有效的最终局部变量”,而这似乎编译器应该足够聪明,做这样的事情
import java.util.stream.IntStream;
public class Example
{
public static void main(String args[])
{
int i = 5;
i = 6;
final int _i = i;
IntStream.range(0, 10).mapToLong(j-> _i * j).sum();
}
}
的编译器可以强制终结变量永远不会被lambda函数修改
它可以;它会让代码更难以推理。 –
会使它在多线程场景中难以使用和理解(这也从总决赛中受益)。 –
@AdamKotwasinski多线程如何改变任何东西?我不建议lambda函数能够修改其父范围中的变量 – crow