什么是函数式接口

时间:2022-10-06 12:30:34 类型:JAVA
字号:    

什么是函数式接口?

  只包含一个抽象方法的接口,称为函数式接口。

  通常我们会在函数式接口上使用@FunctionalInterface注解来标记它是一个函数式接口,使用了该注解标记的接口,会在编译期检查该接口是否是函数式接口,提醒开发者。(非强制性,不使用该注解标记,只要符合只包含一个抽象方法要求同样是函数式接口,但建议使用)

什么是Lambda表达式?

  Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(作为参数传入方法中)。而函数式接口可以简写为Lambda表达式,写出更简洁、更灵活的代码。函数式接口和Lambda表达式相辅相成,为Java语言提供了一种更紧凑更易于理解的写法。

// 通常lambda表达式 (a, b) -> {
    ...}

  左侧:指定了 Lambda 表达式需要的参数列表

  **右侧:**指定了 Lambda体,是抽象方法的实现逻辑,也即Lambda表达式要执行的功能

  常规形式(有参数类型,有括号,有花括号)

public class lamda {

    public static void main(String[] args) {
        Hello like = (int i)->{
            System.out.println("hello" + i);
        };
        like.hello(5);
    }
}
interface Hello {
     void hello(int i);
}

  对于多个参数的方法:

public class lamda {

    public static void main(String[] args) {

        Hello like = (i,j)->{
            System.out.println("hello" + i + j);
        };

        like.hello(5,"world");
    }
}
interface Hello {
     void hello(int i,String j);
}

  对于无参或者一个参数的方法:

public class lamda {

    public static void main(String[] args) {

        Hello like = i->{
            System.out.println("hello" + i);
        };

        like.hello(5,);
    }
}
interface Hello {
     void hello(int i);
}

  对于只有一行代码的方法:

public class lamda {
    public static void main(String[] args) {
        Hello like = (i,j)->System.out.println("hello" + i + j);
        like.hello(5,"world");
    }
}
interface Hello {
     void hello(int i,String j);
}

  总结:

  前提是接口为函数式接口(只有一个方法的接口)

  以上所有简化形式可以一起使用,即可以既简化参数类型,又可以简化括号

  lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。

  多个参数也可以去掠参数类型,要去掉就都去掉,必须加上括号


<