天天看点

jdk1.8的lambda表达式与方法引用的基本用法

一、List排序

1、java8的API已经为List提供了一个可用的sort方法;

void sort(Comparator<? super E> c);

我们用一个苹果类来说明,一般的写法是这样:

jdk1.8的lambda表达式与方法引用的基本用法
jdk1.8的lambda表达式与方法引用的基本用法

我们使用匿名类来处理一下:

jdk1.8的lambda表达式与方法引用的基本用法

因为Comparator是一个函数式接口(函数式接口是指接口类中只一个抽象方法,允许有多个默认方法),则可以使用lambda表达式。

而Comparator的函数描述符为(T,T) -> int ,接收两个T对象,返回一个int,用lambda表达式的效果如下。

jdk1.8的lambda表达式与方法引用的基本用法

由于java编译器可以根据lambda出现的上下文来推断lambda表达式参数类型,因为list泛型已经指定为Apple类型,所以方法参数类型可以省略。重写如下:

jdk1.8的lambda表达式与方法引用的基本用法

又由于Comparator提供了一个comparing的静态辅助方法,源码如下:

jdk1.8的lambda表达式与方法引用的基本用法

形参是一个Function函数接口(接收一个T类型,返回一个U类型),comparing是一个已经实现了比较功能,返回一个Comparator对象的方法,因此我们可以写成如下这样:

jdk1.8的lambda表达式与方法引用的基本用法

注意上面要引入一个静态类。根据上下文推断,可以简写为如下:

jdk1.8的lambda表达式与方法引用的基本用法

而lambda表达式又有一个种方法引用(::)的代替方式,因为可以继续简写:

jdk1.8的lambda表达式与方法引用的基本用法

其中jdk1.8提供的函数接口提供了相关的复合方法,可以把操作复合在一起,比如:Predicate接口就提供了negate(),and(),or()等方法,redApple.and(a -> a.getWeight() > 50).or(a -> “green”.equals(a.getColor()));