Java8在 lambda 表达式中使用局部变量会提示:Local variable flag defined in an enclosing scope must be final or effectively final
这是因为你使用的局部变量在初始化后,又对这个变量进行了赋值。赋值后会认为这个变量不是final了,所以报错,针对这个问题可以有以下几种解决办法。
使用Final修饰符修饰的变量的特点:该变量会变成常亮,值不能被改变,使用Final修饰符修饰的对象的特点:该对象的引用地址不能改变,只能赋值一次,但对象的内容是可以改变的
所以可以把所定义的变量放到集合或者数组中
例如
int[] offsets = {0};
int[] limits = {10};
Optional.ofNullable(params).map(u-> u.get("offset")).ifPresent(
u->{
offsets[0] = (int)params.get("offset");
}
});
Optional.ofNullable(params.get("limit")).ifPresent(u->{
limits[0] = (int)params.get("limit");
});
int offset = offsets[0];
int limit = limits[0];