java8 lambda map<list>排序_java8-Lambda中比较器Comparator的使用

a403e06080ee5668c0d054c7163755a8.png

一、概念

先来看下典型的比较器示例:

Comparator byName = new Comparator() {    @Override    public int compare(Developer o1, Developer o2) {        return o1.getName().compareTo(o2.getName()); // name是String类型    }}复制代码

java8中引入了lambda表达式,比较器可以改成下面这样:

Comparator byName = (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());复制代码

对于数组,Arrays.sort()提供了传入比较器的重载方法,对于列表,Collections.sort()也提供了传入比较器的重载方法。

二、使用实例

2.1 通过new 新建比较器

假如我们要通过Developer 对象的年龄进行排序,通常情况下我们使用Collections.sort,new个匿名Comparator 类,类似下面这种:

import java.math.BigDecimal;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class TestSorting {    public static void main(String[] args) {        List listDevs = getDevelopers();        System.out.println("Before Sort");        for (Developer developer : listDevs) {            System.out.println(developer);        }        //sort by age        Collections.sort(listDevs, new Comparator() {            @Override            public int compare(Developer o1, Developer o2) {                return o1.getAge() - o2.getAge();            }        });        System.out.println("After Sort");        for (Developer developer : listDevs) {            System.out.println(developer);        }    }    private static List getDevelopers() {        List result = new ArrayList();        result.add(new Developer("ricky", new BigDecimal("70000"), 33));        result.add(new Developer("alvin", new BigDecimal("80000"), 20));        result.add(new Developer("jason", new BigDecimal("100000"), 10));        result.add(new Developer("iris", new BigDecimal("170000"), 55));        return result;    }}复制代码

输出结果:

Before SortDeveloper [name=ricky, salary=70000, age=33]Developer [name=alvin, salary=80000, age=20]Developer [name=jason, salary=100000, age=10]Developer [name=iris, salary=170000, age=55]After SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]复制代码

当比较规则发生变化时,你需要再次new个匿名Comparator 类:

 //sort by age    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getAge() - o2.getAge();        }    });    //sort by name    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getName().compareTo(o2.getName());        }    });    //sort by salary    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getSalary().compareTo(o2.getSalary());        }    });复制代码

这样也可以,不过你会不会觉得这样有点怪,因为其实不同的只有一行代码而已,但是却需要重复写很多代码?

2.2 通过lambda表达式新建比较器

在java8中,List接口直接提供了排序方法, 所以你不需要使用Collections.sort:

//List.sort() since Java 8    listDevs.sort(new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o2.getAge() - o1.getAge();        }    });复制代码

Lambda改写:

import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;public class TestSorting {    public static void main(String[] args) {        List listDevs = getDevelopers();        System.out.println("Before Sort");        for (Developer developer : listDevs) {            System.out.println(developer);        }        System.out.println("After Sort");        //lambda here!        listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());        //java 8 only, lambda also, to print the List        listDevs.forEach((developer)->System.out.println(developer));    }    private static List getDevelopers() {        List result = new ArrayList();        result.add(new Developer("ricky", new BigDecimal("70000"), 33));        result.add(new Developer("alvin", new BigDecimal("80000"), 20));        result.add(new Developer("jason", new BigDecimal("100000"), 10));        result.add(new Developer("iris", new BigDecimal("170000"), 55));        return result;    }}复制代码

输出:

Before SortDeveloper [name=ricky, salary=70000, age=33]Developer [name=alvin, salary=80000, age=20]Developer [name=jason, salary=100000, age=10]Developer [name=iris, salary=170000, age=55]After SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]复制代码

2.3 更多的例子

根据年龄:

 //sort by age    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getAge() - o2.getAge();        }    });    //lambda    listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());    //lambda, valid, parameter type is optional    listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());复制代码

根据名字:

//sort by name    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getName().compareTo(o2.getName());        }    });    //lambda    listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName()));    //lambda    listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));复制代码

根据薪水:

 //sort by salary    Collections.sort(listDevs, new Comparator() {        @Override        public int compare(Developer o1, Developer o2) {            return o1.getSalary().compareTo(o2.getSalary());        }    });    //lambda    listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary()));    //lambda    listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()))复制代码

从小到大排序:

Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());    listDevs.sort(salaryComparator);复制代码

从大到小倒序:

Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());    listDevs.sort(salaryComparator.reversed());//Comparator salaryComparator = (o1, o2)->o2.getSalary().compareTo(o1.getSalary());


作者:thulongkang
链接:https://juejin.cn/post/6898898464252690446
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值