lambda小结

新公司用Java8,所以搜了下文档,发现其主要是两个概念:Lambda表达式和函数式接口。

Lambda是一段可执行的代码(类似匿名函数)。

Lambda的设计者们为了让Java现有的体系与Lambda表达式良好兼容,考虑了很多方法,最终产生了函数式接口(FunctionalInterface)这个概念。

所谓函数式接口就是只有一个待实现方法的接口,仍然可以有多个默认方法和静态方法。(注意,待实现方法不包括Object类中的方法,见文尾。)

(默认方法和静态方法不是这里的重点,看看就明白了。)

上面的说法不太清晰,其实就是Java仍然是调用类的静态方法或者调用其实例的方法,具体的方法就是将Lambda映射到相应的接口上面。

以排序为例,传统方法是:

Arrays.sort(array, new XxxComparator());

使用Lambda的方法是:

Arrays.sort(array, (e1, e2) -> (/*具体的比较方法*/) );

其本质上,仍然是将Lambda表达式映射到Comparator接口上面(相当于其实现类),即:

Comparator comp = (e1, e2) -> (/*具体的比较方法*/);

然后再调用comp。

需要说明的是,在Java8中Comparator已经是函数式接口了。

类似的还有Runnable接口等。

new Thread(()->{
    for(int i=0;i<10;i++){
        System.out.println(i);
    }
}).start();

额外说明:Comparator接口中其实还有一个待实现方法equals(),但所有类都最终继承自Object类,所以该方法默认已被实现。

Java中很多接口都添加了Object类中的方法,目的是为了javadoc,有兴趣的自行研究。

原文地址:https://www.cnblogs.com/larryzeal/p/5377303.html