hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

运用Java8 Stream API对Map按键或值举行排序

2019-11-18杂谈搜奇网39°c
A+ A-

一、什么是Java 8 Stream

运用Java 8 Streams,我们能够按键和按值对映射举行排序。下面是它的事情道理:

  1. 将Map或List等鸠合类对象转换为Stream对象
  2. 运用Streams的sorted()要领对其举行排序
  3. 终究将其返回为LinkedHashMap(能够保存排序递次)

sorted()要领以Comparator作为参数,从而能够按任何范例的值对Map举行排序。假如对Comparator不熟悉,能够看本号头几天的文章,有一篇文章特地引见了运用Comparator对List举行排序。

二、进修一下HashMap的merge()函数

在进修Map排序之前,有必要讲一下HashMap的merge()函数,该函数运用场景就是当Key反复的时刻,怎样处置惩罚Map的元素值。这个函数有三个参数:

  • 参数一:向map内里put的键
  • 参数二:向map内里put的值
  • 参数三:假如键发作反复,怎样处置惩罚值。能够是一个函数,也能够写成lambda表达式。
        String k = "key";
        HashMap<String, Integer> map = new HashMap<String, Integer>() {{
            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<String, Integer> 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<String, Integer> 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()返回HashMapHashMap不能保证元素的递次。

假如愿望根据键举行逆向排序,到场下图中赤色部份代码即可。

四、按Map的值排序

固然,您也能够运用Stream API按其值对Map举行排序:

Map<String, Integer> 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<String, Integer> sorted = new TreeMap<>(codes);

这是输出:

China=86
France=33
Germany=49
Pakistan=92
United States=1

如上所示,键(国度/区域称号)以天然字母递次排序。

期待您的关注

  • 博主近来新写了一本书:《手摸手教您进修SpringBoot系列-16章97节》
  • 本文转载说明出处(必需带衔接,不能只转笔墨):字母哥博客。
  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
运用Java8 Stream API对Map按键或值举行排序

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282038.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>