← 返回首页
JavaSE系列教程( 三十)
发表时间:2020-01-07 09:14:10
讲解什么是函数式接口和Lambda表达式。

1.什么是函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

可以使用@FunctionalInterface注解来声明定义函数式接口。

例如:


@FunctionalInterface
public interface MyFunctionInterface {
    //抽象方法
    void fn();
    //静态方法
    static void m(){

    }
    //默认方法
    default void defaultMethod() {
        //implement code
    }
}

 //可以使用匿名内部类实现函数式接口。
public class Test {
    public static void main(String[] args) {

        MyFunctionInterface inter = new MyFunctionInterface() {
            @Override
            public void fn() {
                 System.out.println("实现了 fn()....");
            }
        };

        inter.fn();      
    }
}
运行结果:
实现了 fn()....

2.什么是Lambda表达式

Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实现。 例如:上面的MyFunctionInterface使用Lambda表达式实现如下。


public class Test {

    public static void main(String[] args) {

        MyFunctionInterface inter = ()-> System.out.println("实现了 fn()....");

        inter.fn();
    }
}
运行结果:
实现了 fn()....

Lambda入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符 箭头操作符将Lambda 表达式拆分成两部分: 左侧:Lambda 表达式的参数列表 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体。 语法格式一:无参数,无返回值

void fn();

() -> System.out.println("Hello Lambda!");

语法格式二:有一个参数,并且无返回值

void fn(int x);

(x) -> System.out.println("Hello Lambda!");
//小括号也可以省略不写
x->System.out.println("Hello Lambda!");

语法格式三:有两个以上的参数,有返回值

int add(int x,int y);

(x,y)->{retrun x+y;};
//若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 即
(x,y)->x+y;

小结:

1)有且仅有一个抽象方法,但是可以有多个非抽象方法的接口成为函数式接口,可以使用@FunctionalInterface来检查是否符合函数式接口的要求。

2)函数式接口只能是接口不能是抽象类。

3)对于函数式接口可以使用Lambda表达式实现。Lambda表达式的出现,意味着Java往函数式编程又迈进了一小步。