java闭包和lambda关系_JDK8是否支持闭包,lambda表达式和闭包的关系是什么?

在CoreJava中以打趣的方式有这么一段话:关于代码块以及自由变量值有一个术语: 闭包。如果有人吹嘘他们的语 言有闭包, 现在你也可以自信地说 Java 也有闭包。 在 Java 中, lambda 表达式就是闭包。

但是我现在看来java的lambda表达式其实不能算是完整的闭包;

在lambda表达式中是可以访问到外部的变量的, 但是有一个条件是这个变量在未来不会变化, 则java认为这是effectively final的, 但是在其他语言, 比如js的闭包中, 外部变量变化之后闭包中的调用也会自动变化;

记得偶尔在一篇博客中提到, lambda表达式只是java8提供的对于匿名内部类的一个语法糖, 本质上还是偷偷默认认为所有在lambda中使用的外部变量都是final的;

大家看一下闭包的定义:内部函数可以访问函数外面的变量。

初次看到这句话的时候我是想到了java的内部类, 因为java的内部类的最大优点就是可以访问外部的变量, 而内部类本身对外部类而言是封装不可见的;

但是java的内部类相比于js的闭包有一个要求, 就是:

内部类所使用的外部变量必须声明为final;

综上所述 大概java中并不能严格说拥有像js一样的闭包吧, 不过这样规定在内部使用的外部变量必须是final大概也是一种不错的编程习惯建议? 嘤嘤嘤~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值