前言
今天同事提了一句到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的实现,红黑树的作用、形成、遍历、上浮下沉等,也看了一下数量庞大的源码方法群,确保了它遍历的原理正确,才进行了验证。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93713.html