使用lambda表达式给集合排序

list排序


在java8之前,给list排序需要使用实现java.util.Comparator接口的匿名类:

List<Person> people = ...
Collections.sort(
    people,
    new Comparator<Person>() {
        public int compare(Person p1, Person p2){
            return p1.getFirstName().compareTo(p2.getFirstName());
        }
    }
);

从java8开始可以使用lambda表达式替换匿名类。注意左边的参数p1、p2在编译时自动推导:

Collections.sort(
    people, 
    (p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName())
);

这个例子使用Comparator.comparing 和 ::双冒号可以简单表示:

Collections.sort(
    people,
    Comparator.comparing(Person::getFirstName)
);

静态导入会变得更加简洁,但是整体可读性存在争论:

import static java.util.Collections.sort;
import static java.util.Comparator.comparing;
//...
sort(people, comparing(Person::getFirstName));

比较器可以使用链式方式,例如根据姓名进行,如果姓名相同thenComparing会比较名字:

sort(people, comparing(Person::getFirstName).thenComparing(Person::getLastName));

需要注意的是Collections.sort(...) 是只能用在List的子类型,Set和Collection apis不包含元素排序。


Map排序

你可以进入HasMap的实体给value类似的排序。(注意,LinkedHasMap必须使用标签,键值在普通HasMap里是无序的)

Map<String, Integer> map = new HashMap();  // ... or any other Map class
// populate the map
map = map.entrySet()
    .stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue())
    .collect(Collectors.toMap(k -> k.getKey(), v -> v.getValue(),
                              (k, v) -> k, LinkedHashMap::new));












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值