Skip to content

JDK8 lambda 表达式

qw213 edited this page Sep 28, 2020 · 1 revision

Lambda 表达式结构

传递行为,而不是传递值

(params1, params2, params3....) -> {执行体}

关于函数式接口:

  1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
  2. 如果我们在某个接口上声明了 FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口。
  3. 如果某个接口只有一个抽象方法,但我们并没有给该接口声明 FunctionalInterface 注解,那么编译器依旧会将该接口看成一个函数式接口。

Lambda 表达式作用

  1. Lambda 表达式为 Java 添加了缺失的函数式编程特性,使我们能将函数当做一等公民对待
  2. 在将函数作为一等公民的语言中,Lambda 表达式的类型是函数。但在 java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型-函数式接口
@FunctionalInterface
interface MyInterface2{

    void test();
    //Object 类的方法
    String toString();
}


public class Test2 {

    public void test2(MyInterface2 interface2){
        System.out.println(1);
        interface2.test();
        System.out.println(2);

    }

    public static void main(String[] args){

        Test2 test2 = new Test2();
        test2.test2(new MyInterface2() {
            @Override
            public void test() {
                System.out.println("mytest2");
            }
        });

        System.out.println("===============");

        test2.test2(() -> {
            System.out.println("newMyTest2");
        });

        System.out.println("===============");

        
        //interface2 后面是一个对象 
        MyInterface2 myInterface2 = () -> {
            System.out.println("MyIntesss");
        };

        System.out.println(myInterface2.getClass());
        System.out.println(myInterface2.getClass().getSuperclass());
        System.out.println(myInterface2.getClass().getInterfaces()[0]);
    }
}
Clone this wiki locally