java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序
在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序。前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题。所以我决定写这样一篇文章。在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。
一、什么是Java 8 Stream
使用Java 8 Streams,我们可以按键和按值对映射进行排序。下面是它的工作原理:
将Map或List等集合类对象转换为Stream对象
使用Streams的sorted()方法对其进行排序
最终将其返回为LinkedHashMap(可以保留排序顺序)
sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序。如果对Comparator不熟悉,可以看本号前几天的文章,有一篇文章专门介绍了使用Comparator对List进行排序。
二、学习一下HashMap的merge()函数
在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就是当Key重复的时候,如何处理Map的元素值。这个函数有三个参数:
参数一:向map里面put的键
参数二:向map里面put的值
参数三:如果键发生重复,如何处理值。可以是一个函数,也可以写成lambda表达式。
看上面一段代码,我们首先创建了一个HashMap,并往里面放入了一个键值为k:1的元素。当我们调用merge函数,往map里面放入k:2键值对的时候,k键发生重复,就执行后面的lambda表达式。表达式的含义是:返回旧值oldVal加上新值newVal(1+2),现在map里面只有一项元素那就是k:3。
其实lambda表达式很简单:表示匿名函数,箭头左侧是参数,箭头右侧是函数体。函数的参数类型和返回值,由代码上下文来确定。
三、按Map的键排序
下面一个例子使用Java 8 Stream按Map的键进行排序:
点击可放大
看上文中第二段代码:
首先使用entrySet().stream() 将Map类型转换为Stream流类型。
然后使用sorted方法排序,排序的依据是Map.Entry.comparingByKey(),也就是按照Map的键排序
最后用collect方法将Stream流转成LinkedHashMap。 其他参数都好说,重点看第三个参数,就是一个merge规则的lambda表达式,与merge方法的第三个参数的用法一致。由于本例中没有重复的key,所以新值旧值随便返回一个即可。
上面的程序将在控制台上打印以下内容,键(国家/地区名称)以自然字母顺序排序:
China=86France=33Germany=49Pakistan=92United States=1
请注意使用LinkedHashMap来存储排序的结果以保持顺序。默认情况下,Collectors.toMap()返回HashMap。HashMap不能保证元素的顺序。
如果希望按照键进行逆向排序,加入下图中红色部分代码即可。
四、按Map的值排序
当然,您也可以使用Stream API按其值对Map进行排序:
这是显示Map按值排序的输出:
United States=1France=33Germany=49China=86Pakistan=92
五、使用TreeMap按键排序
大家可能都知道TreeMap内的元素是有顺序的,所以利用TreeMap排序也是可取的一种方法。您需要做的就是创建一个TreeMap对象,并将数据从HashMapput到TreeMap中,非常简单:
// 将 `HashMap` 转为 `TreeMap`Map sorted = new TreeMap(codes);
这是输出:
China=86France=33Germany=49Pakistan=92United States=1
如上所示,键(国家/地区名称)以自然字母顺序排序。
期待您的关注
通过搜-suo-查询“字母哥博客”或zimug点靠m,更多精品合集知识等待你!
本号只做持续的知识输出,希望您能关注、评论、转发!您的支持是我不竭的创作动力!让知识产生价值、让程序员改变世界!
java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序相关推荐
- 注册表处理之(写入DWORD类型或者字符串类型的键项值)
写入DWORD类型或者字符串类型的键项值 HKEY hKey; DWORD dw; RegOpenKeyEx(hMainKey,subKey,0,0,&hKey);//打开子键 if(1 == ...
- java8 lambda maplist排序_「java8系列」流式编程Stream
前言 「Java8系列」神秘的Lambda 「Java8系列」神奇的函数式接口 继上两篇之后,本文已经java8系列的第三篇了.本篇文章比较长,但我希望大家都能认真读完.读不完可以先收藏,在找时间读. ...
- java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计
背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...
- java outputstream api,Java8 stream API以及常用方法
Java8引入了全新的Stream API,Stream API为Java编程提供了丰富的函数式编程操作. Stream API与Java提供的其他集合类型有本质的区别,具体如下: java.io的I ...
- java8 stream流操作集合交集,差集,并集,过滤,分组,去重,排序,聚合等
测试对象 public class Person {private String name;private Integer age;private Integer weight;public Pers ...
- java keyset entryset 顺序_「entryset」如何遍历Map,map的keySet()和EntrySet()区别 - seo实验室...
entryset 如何遍历Map,map的keySet()和EntrySet()区别 遍历map public static void main(String[] args) { // TODO Au ...
- java rowmapper 通用实现_将每行映射为MAP对象的RowMapper实现
import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import j ...
- java map数组定义_如何定义一个空的Map[]数组?
Map[] apsMap = (Map[])request.getAttribute("APSMAP"):有时候我们需要从后台获取一个Map数组,并且使用他. 但是这个Map数组有 ...
- Java8————Stream API
引言 Java8 加入了java.util.stream包,这个包中的相关API将极大的增强容器对象对元素的操作能力. 它专注于对集合对象进行各种便利.高效的聚合操作,或大批量数据处理. Stream ...
最新文章
- Oracle原理:11g中的网络配置
- mysql5.7.10 二进制包_MYSQL5.7二进制包的安装
- python生成文件夹并向文件夹写文件_python - 文件练习生成100个MAC地址写入文件
- Java的权限修饰符,访问范围
- MVC入门小示例---淘宝商品的搜索和价格筛选
- PHP实现完全二叉树
- 《Excel数据处理与分析实战技巧精粹》扫描版[PDF]
- 后台开发 vs App应用开发?
- 20个免费网站测试工具
- [python][project][爬虫] 堆糖网图片下载
- Ubuntu使用Flux调节色温保护眼睛
- 小白也能看懂的手机配置攻略
- c:\windows\ ntdetect failed
- PostgreSQL11 | pgadmin4基本使用
- 皮卡智能联手全球最大贸易服务商PingPong,共推AIGC应用落地服务
- Windows下PostgreSQL 8.1版安装图解
- 使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙
- photoshop做带有透明通道的贴图
- 哈哈!12万行代码堆出来个「蔡徐坤」
- 短视频、直播平台——电商直播源码第三方SDK接入教程
热门文章
- ASP.NET Core 3.0:将会拥有更少的依赖
- 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇
- .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
- .NetCore+Jexus代理+Redis模拟秒杀商品活动
- Visual Studio 2015和2017里面应该创建哪种 Class Library
- 理解并从头搭建redis集群
- Entity Framework Core 1.1 升级通告
- 高可用架构可行性方案
- Nginx—— Rewrite规则的使用
- 利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示