Java的lambda表达式实现解析
程序员文章站
2024-02-10 18:31:11
java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代码编写的语法糖。
但,即便是在其他语言已经司空见惯的lambda表达式,如果在java中...
java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代码编写的语法糖。
但,即便是在其他语言已经司空见惯的lambda表达式,如果在java中要支持它,还需要考虑各种向下兼容的问题。
简单的说,java的lambda表达式支持,大约需要考虑2个方面
- 需要支持lambda语法,以替代原有的方法匿名类
- 需要考虑已有jdk中,如何增加新操作以支持lambda表达式
对于第一点的回答是funtionalinterface的annotation,第二点的回答是default方法。
functionalinteface
通过在一个interface上增加@functionalinterface, 表示这个接口是特殊interface。其特殊性体现在
- 该interface只能有一个抽象方法等待子类实现
- 之后,此interface对应的对象,可以是lambda表达式
- lambda表达式必须与此interface中唯一的抽象方法签名相一致
@functionalinterface public interface itest { void sayhello(string name); } public class testlambda { public static string name = "test"; public static void testrun2(itest test){ test.sayhello(name); } public static void main(string[] args) { testrun2(test->system.out.println(test)); } }
default方法
default方法只能在interface中声明。default方法使得interface也可以定义已经实现的方法。那么问题来了。interface为什么一定需要这个特性?java的interface不就是应该都只有抽象方法吗?
考虑一下这个例子
list<integer> alist = new arraylist<integer>(); alist.add(1); alist.add(2); alist.add(3); alist.add(4); alist.foreach((s)->system.out.println(s));
list是jdk java.util的一个接口。此接口由来已久。如果要在其中引入foreach方法,而且支持使用lambda表达式,必须对list进行一些改变。但是,jdk要向下兼容,一旦对已知的list增加接口,势必无法保证兼容性。所以,出于这个原因,想办法增加了default方法。这使得一个接口可以定义默认方法,以保全jdk原有的接口可以继续向下兼容。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 成都旅游攻略有哪些(带你吃遍成都美食)