List排序进阶

Posted fengyumeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List排序进阶相关的知识,希望对你有一定的参考价值。

初始代码:

一个Apple类

技术分享图片
public class Apple{
    String color;
    Integer size;
    Float weight;
    
    public Apple() {
    }

    public Apple(String color, Integer size, Float weight) {
        this.color = color;
        this.size = size;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    public Float getWeight() {
        return weight;
    }

    public void setWeight(Float weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "weight=" + weight +
                ", size=" + size +
                ", color=" + color +
                ‘}‘;
    }
}
View Code

 

主函数 一个赋值一个打印

    public static void main(String[] args) {
        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple("red",111,333F));
        appleList.add(new Apple("yellow",333,222F));
        appleList.add(new Apple("blue",222,888F));
        appleList.add(new Apple("black",555,777F));
        appleList.add(new Apple("pink",444,111F));
        appleList.add(new Apple("green",666,444F));
    }

    private static <T> void forEach(List<T> list){
        for(Object vo : list){
            System.out.println(vo.toString());
        }
    }

 

第一级:传递代码

Apple类实现Comparator 复写compare

public class Apple implements Comparator<Apple> {
    String color;
    Integer size;
    Float weight;

    @Override
    public int compare(Apple o1, Apple o2) {
        return o1.getSize().compareTo(o2.getSize());
    }
    
    ……
}
        appleList.sort(new Apple());
        forEach(appleList);

打印结果:

技术分享图片

 

第二级:匿名类

Apple类还原 不用实现Comparator

        appleList.sort(new Comparator<Apple>() {
            @Override
            public int compare(Apple o1, Apple o2) {
                return o1.getSize().compareTo(o2.getSize());
            }
        });
        forEach(appleList);

打印结果一样

 

第三级:使用Lambda表达式

一样的传递代码 轻量的写法

        appleList.sort((Apple o1,Apple o2) -> o1.getSize().compareTo(o2.getSize()));
        forEach(appleList);

 

能再简洁点吗?  能。

java编译器可以根据lambda的上下文来推断表达式参数的类型,所以写Lambda的时候可以省略参数类型

        appleList.sort((o1,o2) -> o1.getSize().compareTo(o2.getSize()));
        forEach(appleList);

 

还能再简洁点吗? 能。

Comparator有一个comparing的静态辅助方法,可以接受一个函数来提取Comparable的键值,并生成一个Comparator对象

        appleList.sort(Comparator.comparing((a)->a.getSize()));
        forEach(appleList);

 

第四级:使用方法引用

        appleList.sort(Comparator.comparing(Apple::getSize));
        forEach(appleList);

方法引用仅仅是涉及单一方法的Lampbda语法糖,使用方式和php中的调用静态方法一样,类::方法。

 

以上是关于List排序进阶的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Java 8 进阶手册(XX):使用 Comparator 对列表进行排序

Java 8 进阶手册(XX):使用 Comparator 对列表进行排序

Atom编辑器入门到精通 Atom使用进阶

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段