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));

代码可读性更强:对库存排序,基于苹果的重量。

posted @ 2023-06-28 17:46  夜是故乡明  阅读(3)  评论(0编辑  收藏  举报