弱问一个问题:lambda或者闭包不能修改外部变量,还拿来干什么呢?

lxyscls 2016-07-26 02:05:07

int res = -1;
BiConsumer<Integer, Integer> bi = (t,u) -> { if (u >= nums.length/2) res = u; };
map.forEach(bi);
return res;


引用
error: local variables referenced from a lambda expression must be final or effectively final


int res = -1;
map.forEach(new BiConsumer<Integer, Integer>() {
public void accept(Integer u, Integer v) {
if (v >= nums.length/2) res = u;
}
});
return res;


引用
error: local variables referenced from an inner class must be final or effectively final


Java8,难道是我用错了?
...全文
306 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxyscls 2016-09-21
  • 打赏
  • 举报
回复
lambda 局部类 匿名类都不能访问非final变量和参数 因为根本问题在于:局部类 匿名类 lambda可以在生成后,其他地方再使用,这个时候这些变量其实可能已经不存在了;能够访问到的final变量和参数,也只是javac给予其的一个副本
tatakautsubasa 2016-07-27
  • 打赏
  • 举报
回复
正因为不能修改外部变量,才是线程安全的。
soton_dolphin 2016-07-26
  • 打赏
  • 举报
回复
lamda 最大的用处就是可以把函数当做变量传来传去。 比如你有一个整数list,{1,2,3,4} 你传入一个加法的函数,输出就是和,你传入一个乘法的函数,输出就是积,而这个list里面的元素没有被改动。
希瓦咸鱼 2016-07-26
  • 打赏
  • 举报
回复
封包 一方面可以防止 命名空间污染,只在封闭的包内可以用

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧