Java8新特性 —— Lambda表达式

Lambda表达式(也称为闭包)把一个函数实现作为参数传递到具体代码逻辑中(行为即参数),Java通过参数类型来推断出具体实现意图,不需要写全参数类型信息,大大简化了代码量。
Lambda表达式简化了匿名内部类的写法,是Java函数式编程的一种体现。

以往的函数式编程写法:

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});

Lambda写法:

Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
Lambda特征:

1、参数类型声明可选:由编译器去统一识别;
2、参数圆括号声明:只有一个参数不需要圆括号,多个参数需要;
3、实现逻辑的大括号:如果只包含一条语句,则无需使用大括号;
4、实现逻辑中的return关键字:如果一条语句中直接返回,则无需return关键字。

Lambda表达式如何匹配到接口中对应函数:

1、接口中未实现的函数只有一个;(可以定义Object基类方法)
2、接口中未实现的函数的参数和Lambda表达式中参数一致(类型、数量、顺序完全一致);
3、接口中可以存在已实现的其他函数(Java8支持)。

实例验证一下:

public class OperatorTest {

    public static final void main(String[] args) {

        Operator addOper = (a, b) -> a + b;
        Operator reduceOper = (a, b) -> a - b;
        Operator multiplyOper = (a, b) -> a * b;
        Operator DivideOper = (a, b) -> a / b;

        OperatorTest test = new OperatorTest();
        System.out.println(test.getResult(3, 3, addOper));
        System.out.println(test.getResult(3, 3, reduceOper));
        System.out.println(test.getResult(3, 3, multiplyOper));
        System.out.println(test.getResult(3, 3, DivideOper));
    }

    public int getResult(int a, int b, Operator operator) {
        return operator.convert(a, b);
    }

    public interface Operator {
        int convert(int a, int b);
        default int get(int a) {
            return a;
        }

        // Object 基类方法可以有
        boolean equals(Object obj);
        String toString();
        int hashCode();
    }
}

如果Operator接口中还存在int set(int a); 这样未实现的方法,则Lambda表达式会编译报错:

Operator '+' cannot be applied to '<lambda parameter>', '<lambda parameter>'

因为编译器无法正常识别Lambda表达式实现的是接口中的哪个函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。