lambda表达式是什么
Lamba是一种实现@FunctionInterface的机制,@FunctionInterface是只带有一个虚方法的接口。可以把lambda表达式看成一个函数,这个函数就是对@FunctionInterface中虚方法的实现。
lambda表达式可以是() -> {}
这样的,也可以是x->{}
这样的,甚至可以直接是引用的一个函数,比如system.out::println
这样的。
直接使用函数
直接使用函数有各种各样的变种,包括
- 类::静态方法
- 类::实例方法
- 对象::实例方法
- 构造函数,这个比较特殊,实际上是
类型::New()
,而类型可能是某个类,也可以是类的数组。
总之,不管什么样的函数,只要是能够转换成对@FunctionInterface中虚方法的实现就行。
变量引用域
Lambda表达式变量有两个特点:
- 词法范围是外层函数,与嵌套代码有相同的作用域,拟不能与外面的嵌套代码中的变量重名;并且,如果在lambda表达式中使用this事实上是嵌套代码中的this对象。
- 由于匿名类对于自由变量的捕获,所以对于外部局部变量(包括函数的参数),要做到事实上的final。不能直接改变变量(给变量赋值),而只是能够调用它的方法。
默认方法
默认方法与lambda表达式并不是一个东西,这是java为了能够向前兼容,给接口添加新方法与默认实现的做法。
默认方法会导致出现冲突,解决冲突的原则非常简单:
- 父类优先
- 如果是父接口出现冲突,需要手动解决冲突
接口静态方法
既然已经有了默认方法,那么支持接口的静态方法也就一点都不奇怪了。
网友评论