java基础之Comparator接口的使用

新建测试类

    private Integer area;
    private String name;
    public static List<City> getInstance(Integer number) {
        List<City> cityList = new ArrayList<>();
        for (int i = 0; i < number; i++) {
            City city = new City((int) (Math.random() * 1000), getCitys()[i]);
            cityList.add(city);
        }
        return cityList;
    }
    private static String[] getCitys() {
        String[] citys = {"南京", "上海", "北京", "重庆", "杭州","长沙",null,"","马鞍山","广东"};
        return citys;
    }

使用场景

Arrays.sort方法

private static String[] getCitys() {
    String[] citys = {"南京", "上海", "北京", "重庆", "杭州","长沙",null,"","马鞍山","广东"};
    return citys;
}

public static void main(String[] args) {
    String[] citys = getCitys();
    Arrays.sort(citys, Comparator.comparing((s -> s),Comparator.nullsLast(String::compareTo)));
    for (String city : citys) {
        System.out.println(city);
    }
}

Collections.sort方法

       List<City> cityList = City.getInstance(9);
       cityList.forEach(System.out::println);
       System.out.println("===============");
//        Collections.sort(cityList,(City c1,City c2) -> {
//            return c1.getArea().compareTo(c2.getArea());
//        });
       Collections.sort(cityList, Comparator.comparing(City::getArea));
       cityList.forEach(System.out::println);

Comparator.comparing(City::getName)

源码

通过传入函数式接口返回比较器

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }

出现空值时报空指针异常

在这里插入图片描述

Comparator.nullsLast(String::compareTo)将空值放到最后

        List<City> cityList = City.getInstance(9);
        cityList.forEach(System.out::println);
        System.out.println("===============");
        List<City> collect = cityList.stream().sorted(Comparator.comparing(City::getName,Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
        collect.forEach(System.out::println);

在这里插入图片描述

Comparator.nullsFirst(String::compareTo)将空值放到最前

        List<City> cityList = City.getInstance(9);
        cityList.forEach(System.out::println);
        System.out.println("===============");
        List<City> collect = cityList.stream().sorted(Comparator.comparing(City::getName,Comparator.nullsFirst(String::compareTo))).collect(Collectors.toList());
        collect.forEach(System.out::println);

在这里插入图片描述
当出现两个空值时,按插入的顺序取出。
在这里插入图片描述

thenComparing链式比较

        List<City> cityList = City.getInstance(9);
        cityList.forEach(System.out::println);
        System.out.println("===============");
        List<City> collect = cityList.stream().sorted(Comparator.comparing(City::getName,Comparator.nullsFirst(String::compareTo)).thenComparing(City::getArea)).collect(Collectors.toList());
        collect.forEach(System.out::println);

在这里插入图片描述

用起来easy源码理解起来还是有难度的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值