前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

作者头像
java架构师
发布2018-12-27 17:54:59
8960
发布2018-12-27 17:54:59
举报
文章被收录于专栏:Java架构师进阶

今天我们来实战一把, 对Map的Value值排序进行简化.

在以前的思路我们的做法如下:

/**

*

* Map根据value排序;

*

* @param map

* @return

*/publicstatic>Map sortByValue(Map map) {List> list =newLinkedList<>(map.entrySet()); Collections.sort(list,newComparator>() {@Overridepublicintcompare(Map.Entry o1,Map.Entry o2) {return(o2.getValue()).compareTo(o1.getValue()); } });Map result =newLinkedHashMap<>();for(Map.Entry entry : list) { result.put(entry.getKey(), entry.getValue()); }returnresult; }

什么意思呢?意思就是先把Map变成可排序的List使用Comparator接口对entry进行排序, 可是这样代码很多很乱, 我们需要做一些简化.

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

第一步: 使用Lambda表达式先对Comparator接口做简化, 代码会变成如下情况:

publicstatic >Map sortByValue(Mapmap) {List>list=newLinkedList<>(map.entrySet());list.sort(Comparator.comparing(Entry::getValue));Map result =newLinkedHashMap<>(); for (Map.Entry entry :list) { result.put(entry.getKey(), entry.getValue()); }returnresult; }

这样的话, 一行代码就代替了五行, 但是会有个问题, 这样写只能从小到大排序很不灵活, 我们还有其他办法.来看下面的代码:

public static > Map sortByValue(Map map) { List> list =newLinkedList<>(map.entrySet());  list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue()));Mapresult=newLinkedHashMap<>();for(Map.Entry<K, V> entry : list){result.put(entry.getKey(), entry.getValue()); }returnresult; }

用lambda表达式就可以做到变换排序的方式, 只要改变o1和o2的顺序就可以了.哎, 可以还是很长, 我还想再少几句代码, 怎么办?

我们来分析下最原始的排序代码 ---> 首先是将Map转化为List<Entry>利用List的可排序的特性排序后遍历到新的Map里面去, 这样就很简单了, 我们可以从遍历的地方入手.代码如下:

public static > Map sortByValue(Map map) { List> list =newLinkedList<>(map.entrySet());  list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue()));Mapresult=newLinkedHashMap<>();list.stream().forEach(entry -> result.put(entry.getKey(), entry.getValue()));returnresult; }

也许做到上面这一步已经很满足了, 可是作为一个优秀的开发人员怎么能满足于这种程度, 我们要用两句话完成上面的功能.我们可以发现entrySet()是个集合, stream是有sort方法的, 可以set变成stream然后sort之后forEach到新的Map中, 牛逼吧, 废话少说,看代码.

public static > Map sortByValue(Map map) { Map sortMap =newLinkedHashMap<>();newmap.entrySet().stream() .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).forEach(entry -> sortMap.put(entry.getKey(), entry.getValue()));returnsortMap; }

高级程序员到这里就可以了, 下面提供一个工具类给大家使用.

/**

* flag = 1 正序

* flag = 0 倒序

* @param map

* @param flag

* @return

*/public static > Map sortByValue(Map map, int flag) { Map sortMap =newLinkedHashMap<>();if(flag ==1) { map.entrySet().stream() .sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); }else{map.entrySet().stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); }returnsortMap; }

以上的代码已经够简洁了, 但是有一个中间变量, 我作为一个究极程序员是看不惯的, 能不能把它也省略掉一句代码实现整个功能呢? 答案是可以的.

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

public static > Map sortByValue2(Map map, int flag) {if(flag ==1) {returnmap.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).map(entry -> { Map result =newLinkedHashMap<>(); result.put(entry.getKey(), entry.getValue());returnresult; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue()));returnmap1; }).get(); }else{returnmap.entrySet().stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).map(entry -> { Map result =newLinkedHashMap<>(); result.put(entry.getKey(), entry.getValue());returnresult; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue()));returnmap1; }).get();  }

思路是做好排序后将排序后的entry加入到新的Map里面, 再将stream<Map<K,V>>进行叠加, 可能有些抽象, 不能明白的也只能帮到这啦.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档