欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的lambda表达式实现解析

程序员文章站 2023-12-17 14:54:28
java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代码编写的语法糖。 但,即便是在其他语言已经司空见惯的lambda表达式,如果在java中...

java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代码编写的语法糖。

但,即便是在其他语言已经司空见惯的lambda表达式,如果在java中要支持它,还需要考虑各种向下兼容的问题。

简单的说,java的lambda表达式支持,大约需要考虑2个方面

  • 需要支持lambda语法,以替代原有的方法匿名类
  • 需要考虑已有jdk中,如何增加新操作以支持lambda表达式

对于第一点的回答是funtionalinterface的annotation,第二点的回答是default方法。

functionalinteface

通过在一个interface上增加@functionalinterface, 表示这个接口是特殊interface。其特殊性体现在

  1. 该interface只能有一个抽象方法等待子类实现
  2. 之后,此interface对应的对象,可以是lambda表达式
  3. 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原有的接口可以继续向下兼容。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: