3.7 Lambda和方法引用实战
基于行为参数化、匿名类、Lambda表达式和方法引用(第2章和第3章前面的内容),逐步将用不同的排序策略给一个Apple列表排序的示例简化。
3.7.1 第1步:传递代码
List提供了sort的默认实现,方法签名为void sort(Comparator<? super E> c)
,通过传递比较器Comparator,完成列表的排序。
定义一个Comparator的实现类,传递实现类的实例。
public class AppleComparator implements Comparator<Apple> {
@Override
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
}
// invoke
inventory.sort(new AppleComparator());
3.7.2 第2步:使用匿名类
实现类只实例化一次,改为匿名类。
inventory.sort(new Comparator<Apple>() {
@Override
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}});
3.7.3 第3步:使用Lambda表达式
Lambda表达式改为匿名类,使代码更简洁。
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
基于类型推断,可以省略参数
inventory.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));
Comparator提供了静态方法comparing,接收一个Function参数用于提取对象的键值,生成一个Comparator对象。
inventory.sort(Comparator.comparing((Apple a) -> a.getWeight()));
基于类型推断,可以省略参数
inventory.sort(Comparator.comparing((a) -> a.getWeight()));
3.7.4 第4步:使用方法引用
用语法糖方法引用替换Lambda表达式
inventory.sort(Comparator.comparing(Apple::getWeight));
代码可读性更强:对库存排序,基于苹果的重量。