一行代码实现Map排序(JDK8+TreeMap+比较器)

前言

今天同事提了一句到list转map排序有什么技巧性的方法,他用了LinkedHashMap,而且用惯stream了,就想根据链表特性和stream的方法,先整理再顺序塞值,但是又不熟Collectors.toCollect的操作,担心不会按序生成。

期间搜的一些map排序文章还蛮无语的,
有用HashMap排的,
有用将 map 转为流,对流排序,收集并返回一个新的 LinkedHashMap的,写了一大堆。

我想,可以用TreeMap,自己写个比较。

本着能
写一行就不写两行
能用stream就不用for遍历
能用lambda就不写匿名内部类
能用方法引用就不写lambda体
的等等洁癖,直接把换了一行代码就ok

原结构

KeyObject是一个对象,要根据它的属性order排序;
ValueStrategy一个策略接口,于本文无关。

Map<KeyObject, ValueStrategy> data = new LinkedHashMap<>();

TreeMap+Lambda表达式

Map<KeyObject, ValueStrategy> data = 
new TreeMap<>((m1, m2) -> m1.getOrder() - m2.getOrder());

TreeMap+方法引用

Map<KeyObject, ValueStrategy> data = 
new TreeMap<>(Comparator.comparingInt(KeyObject::getOrder));

结语

写完这简单一句,其他使用map的地方也不用改了,这种写法,刷一段时间源码、写一段时间算法就能形成记忆,把自己觉得最好的解决方案写到代码里。我们就又聊了聊TreeMap的实现,红黑树的作用、形成、遍历、上浮下沉等,也看了一下数量庞大的源码方法群,确保了它遍历的原理正确,才进行了验证。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值