java8+sorted+map排序_使用Java8 Stream API对Map按键或值进行排序

一、什么是Java 8 Stream

使用Java 8 Streams,我们可以按键和按值对映射进行排序。下面是它的工作原理:

a86e47afba9a0b6ef98dd0a792c4585f.png

将Map或List等集合类对象转换为Stream对象

使用Streams的sorted()方法对其进行排序

最终将其返回为LinkedHashMap(可以保留排序顺序)

sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序。如果对Comparator不熟悉,可以看本号前几天的文章,有一篇文章专门介绍了使用Comparator对List进行排序。

二、学习一下HashMap的merge()函数

在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就是当Key重复的时候,如何处理Map的元素值。这个函数有三个参数:

参数一:向map里面put的键

参数二:向map里面put的值

参数三:如果键发生重复,如何处理值。可以是一个函数,也可以写成lambda表达式。

String k = "key";

HashMap map = new HashMap() {{

put(k, 1);

}};

map.merge(k, 2, (oldVal, newVal) -> oldVal + newVal);

看上面一段代码,我们首先创建了一个HashMap,并往里面放入了一个键值为k:1的元素。当我们调用merge函数,往map里面放入k:2键值对的时候,k键发生重复,就执行后面的lambda表达式。表达式的含义是:返回旧值oldVal加上新值newVal(1+2),现在map里面只有一项元素那就是k:3。

其实lambda表达式很简单:表示匿名函数,箭头左侧是参数,箭头右侧是函数体。函数的参数类型和返回值,由代码上下文来确定。

三、按Map的键排序

下面一个例子使用Java 8 Stream按Map的键进行排序:

// 创建一个Map,并填入数据

Map codes = new HashMap<>();

codes.put("United States", 1);

codes.put("Germany", 49);

codes.put("France", 33);

codes.put("China", 86);

codes.put("Pakistan", 92);

// 按照Map的键进行排序

Map sortedMap = codes.entrySet().stream()

.sorted(Map.Entry.comparingByKey())

.collect(

Collectors.toMap(

Map.Entry::getKey,

Map.Entry::getValue,

(oldVal, newVal) -> oldVal,

LinkedHashMap::new

)

);

// 将排序后的Map打印

sortedMap.entrySet().forEach(System.out::println);

看上文中第二段代码:

首先使用entrySet().stream() 将Map类型转换为Stream流类型。

然后使用sorted方法排序,排序的依据是Map.Entry.comparingByKey(),也就是按照Map的键排序

最后用collect方法将Stream流转成LinkedHashMap。 其他参数都好说,重点看第三个参数,就是一个merge规则的lambda表达式,与merge方法的第三个参数的用法一致。由于本例中没有重复的key,所以新值旧值随便返回一个即可。

上面的程序将在控制台上打印以下内容,键(国家/地区名称)以自然字母顺序排序:

China=86

France=33

Germany=49

Pakistan=92

United States=1

请注意使用LinkedHashMap来存储排序的结果以保持顺序。默认情况下,Collectors.toMap()返回HashMap。HashMap不能保证元素的顺序。

如果希望按照键进行逆向排序,加入下图中红色部分代码即可。

9e6b4ea2b37d4d28a0ba5abfa6cc400c.png

四、按Map的值排序

当然,您也可以使用Stream API按其值对Map进行排序:

Map sortedMap2 = codes.entrySet().stream()

.sorted(Map.Entry.comparingByValue())

.collect(Collectors.toMap(

Map.Entry::getKey,

Map.Entry::getValue,

(oldVal, newVal) -> oldVal,

LinkedHashMap::new));

sortedMap2.entrySet().forEach(System.out::println);

这是显示Map按值排序的输出:

United States=1

France=33

Germany=49

China=86

Pakistan=92

五、使用TreeMap按键排序

大家可能都知道TreeMap内的元素是有顺序的,所以利用TreeMap排序也是可取的一种方法。您需要做的就是创建一个TreeMap对象,并将数据从HashMapput到TreeMap中,非常简单:

// 将 `HashMap` 转为 `TreeMap`

Map sorted = new TreeMap<>(codes);

这是输出:

China=86

France=33

Germany=49

Pakistan=92

United States=1

如上所示,键(国家/地区名称)以自然字母顺序排序。

期待您的关注

本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

何用Java8 Stream API进行数据抽取与收集

上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...

如何用Java8 Stream API找到心仪的女朋友

传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...

C&plus;&plus;中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客

C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...

恕我直言你可能真的不会java第12篇-如何使用Stream API对Map类型元素排序

在这篇文章中,您将学习如何使用Java对Map进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Java中,有 ...

JAVA8 Stream API的使用

/** * @auther hhh * @date 2018/12/31 12:48 * @description Stream流:用来处理数组.集合的API * 1.不是数据结构,没有内部存储(只是 ...

Fork&sol;Join框架与Java8 Stream API 之并行流的速度比较

Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...

Java8 Stream API

Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...

java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合

//定义一个100元素的集合,包含A-Z List list = new LinkedList<>(); for (int i =0;i<100;i++) ...

java8 Stream API笔记

生成Stream Source的方式 从Collection和数组生成 * Collection.stream() * Collection.parallelStream() * Arrays.str ...

随机推荐

基础知识《十》java 异常捕捉 &lpar; try catch finally &rpar; 你真的掌握了吗?

本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

IOS Socket 03-建立连接与登录

1. 搭建python服务器 这里我们用到python服务器Socket Server.如何运行Server?下面介绍 1)通过百度云下载文件 http://pan.baidu.com/s/1i5yb ...

(五)乱入之如何使用MNIST数据库

(五)乱入之如何使用MNIST数据库 今天花了整整一天时间查各种资料,终于搞清楚了怎么使用MNIST数据库.哈哈,MNIST,是不是高端洋气上档次?是不是不知道是什么东东? MNIST是一个据说很出名 ...

hdu-A&plus;B问题,大数加法

格式问题很头疼啊 Input The first line of the input contains an integer T(1<=T<=20) which means the num ...

JS高级程序设计第3章读书笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值