文档章节

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

编程SHA
 编程SHA
发布于 2018/12/19 11:30
字数 1264
阅读 83
收藏 3

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

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

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

 
/** * * Map根据value排序; * * @param map * @return */ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { return (o2.getValue()).compareTo(o1.getValue()); } }); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } 

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

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

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

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort(Comparator.comparing(Entry::getValue)); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } 

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

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue())); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } 

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

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

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); list.sort((o1, o2)-> o2.getValue().compareTo(o1.getValue())); Map<K, V> result = new LinkedHashMap<>(); list.stream().forEach(entry -> result.put(entry.getKey(), entry.getValue())); return result; } 

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

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { Map<K, V> sortMap = new LinkedHashMap<>(); new map.entrySet().stream() .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue())); return sortMap; } 

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

 
/** * flag = 1 正序 * flag = 0 倒序 * @param map * @param flag * @return */ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map, int flag) { Map<K, V> sortMap = new LinkedHashMap<>(); 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())); } return sortMap; } 

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

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

 
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue2(Map<K, V> map, int flag) { if(flag == 1) { return map.entrySet().stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).map(entry -> { Map<K, V> result = new LinkedHashMap<>(); result.put(entry.getKey(), entry.getValue()); return result; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue())); return map1; }).get(); } else { return map.entrySet().stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).map(entry -> { Map<K, V> result = new LinkedHashMap<>(); result.put(entry.getKey(), entry.getValue()); return result; }).reduce((map1, map2) -> { map2.entrySet().forEach(entry -> map1.put(entry.getKey(), entry.getValue())); return map1; }).get(); } 

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

© 著作权归作者所有

编程SHA
粉丝 22
博文 207
码字总数 503378
作品 0
长沙
私信 提问
加载中

评论(0)

java8的重要特性及其他,昨天答应的发java8╭(╯ε╰)╮

【注意】本文节选自是 DZone 指南 Java 生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由OneAPM工程师翻译。 ...

默默学习中
2016/03/28
1.5K
9
java8新特性介绍

一:接口的默认方法 Java8允许开发者通过使用关键字default向接口中加入非抽象方法。这一特性被称为扩展方法。

yjpfj1203
2016/12/15
76
0
为什么选择 Java 8 ?

本文是 DZone 指南 Java 生态系统的专题文章。点击链接可阅读更多见解深刻的文章、行业统计信息,系 OneAPM工程师编译整理。 在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调...

OneAPM蓝海讯通
2015/11/04
176
0
JAVA8的新特性

很高兴能在此给大家分享Java8的新特性。这篇文章将一步一步带你了解Java8的所有新特性。我将通过简单的实例代码向大家展示接口中默认方法,lambda 表达式,方法引用,重复注解的使用. 看过这篇...

莫问viva
2015/12/22
592
0
java8之lambda介绍

Java是一门面向对象编程语言。面向对象编程语言和函数式编程语言中的基本元素(Basic Values)都可以动态封装程序行为:但这个相同点并不明显,因为Java的对象往往比较“重量级”:实例化一个...

那位先生
2016/02/19
133
0

没有更多内容

加载失败,请刷新页面

加载更多

易鑫车贷人工客服电话是多少

易鑫车贷人工客服电话是多少O29-63O37558人工客服电话O29-688O2826方法,大家可以采取一些传统的方式,比如说打开易鑫车贷,然后设置,就会看到帮助与反馈的字眼,然后大家打开这到各种各样的问题...

fgrf
今天
58
0
IntelliJ 如何找到项目中 Deprecated 的方法

在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection。 选择 Analyze > Inspect Code 在弹出的对话框中,对整个...

honeymoose
今天
93
0
Java中的排序算法:冒泡排序

学习了一种新的排序算法:冒泡排序,冒泡排序是一种交换排序,指比较相邻的两个元素,如果前者比后者大,就交换位置,继续进行比较。 通过例子来实现: import java.util.Arrays; public cl...

北芷南姜
今天
73
0
OSChina 周五乱弹 —— 你不仅要背负工作,还要背负领导

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Cold Rain》- AniFace 手机党少年们想听歌,请使劲儿戳(这里) @明月依稀 :露...

小小编辑
今天
1.2K
5
个人环境之ubuntu的apt-get 总结

前言 apt-get是必须要学会的,如果搞定apt-get,可解决很多问题。接下来鸟才啊总结以往经验。 场景一 指定安装版本 先查看有软件有那些版本可以安装 apt-cache madison gcc-4.8 gcc-4.8 ...

鸟菜啊
今天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部