文档章节

Java 8 将 list 转为 map

山川尽美
 山川尽美
发布于 2019/09/06 17:39
字数 598
阅读 362
收藏 13

引言

创建一个对象类

public class Hosting {

    private int Id;
    private String name;
    private long websites;

    public Hosting(int id, String name, long websites) {
        Id = id;
        this.name = name;
        this.websites = websites;
    }

    //getters, setters and toString()
}

1.List to Map – Collectors.toMap()

创建 Hosting 对象的列表,并使用 Collectors.toMap 将其转换为 Map。

public static void testOne(){
    List<Hosting> list = new ArrayList<>();
    list.add(new Hosting(1, "liquidweb.com", 80000));
    list.add(new Hosting(2, "linode.com", 90000));
    list.add(new Hosting(3, "digitalocean.com", 120000));
    list.add(new Hosting(4, "aws.amazon.com", 200000));
    list.add(new Hosting(5, "mkyong.com", 1));

    // key = id, value - websites
    Map<Integer, String> result1 = list.stream()
        .collect(Collectors.toMap(Hosting::getId, Hosting::getName));

    System.out.println("result1:" + result1);

    // key = name, value - websites
    Map<String, Long> result2 = list.stream()
        .collect(Collectors.toMap(Hosting::getName, Hosting::getWebsites));

    System.out.println("result2:" + result2);

    // key = id, value = name 另一种写法
    Map<Integer, String> result3 = list.stream()
        .collect(Collectors.toMap(x -> x.getId(), x -> x.getName()));

    System.out.println("result3:" + result3);
  }

2.List to Map – Duplicated Key

重复的 key 抛出异常。

private static void testTwo() {
    List<Hosting> list = new ArrayList<>();
    list.add(new Hosting(1, "liquidweb.com", 80000));
    list.add(new Hosting(2, "linode.com", 90000));
    list.add(new Hosting(3, "digitalocean.com", 120000));
    list.add(new Hosting(4, "aws.amazon.com", 200000));
    list.add(new Hosting(5, "mkyong.com", 1));

    list.add(new Hosting(6, "linode.com", 100000)); // new line

    Map<String, Long> result1 = list.stream()
        .collect(Collectors.toMap(Hosting::getName, Hosting::getWebsites));

    System.out.println("result1:" + result1);
  }

输出——下面的错误消息有点误导人,它应该显示“ linode”而不是键的值。

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 90000
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1245)
	//...

要解决上面重复的关键问题,传入第三个 mergeFunction 参数,如下所示:

private static void testTwo() {

    List<Hosting> list = new ArrayList<>();
    list.add(new Hosting(1, "liquidweb.com", 80000));
    list.add(new Hosting(2, "linode.com", 90000));
    list.add(new Hosting(3, "digitalocean.com", 120000));
    list.add(new Hosting(4, "aws.amazon.com", 200000));
    list.add(new Hosting(5, "mkyong.com", 1));

    list.add(new Hosting(6, "linode.com", 100000)); // new line

//    Map<String, Long> result1 = list.stream()
//        .collect(Collectors.toMap(Hosting::getName, Hosting::getWebsites));

    Map<String, Long> result1 = list.stream().collect(
        Collectors.toMap(Hosting::getName, Hosting::getWebsites, (oldValue, newValue) -> oldValue));

    System.out.println("result1:" + result1);
  }

输出:

result1:{liquidweb.com=80000, mkyong.com=1, digitalocean.com=120000, aws.amazon.com=200000, linode.com=90000}

使用新值:

Map<String, Long> result1 = list.stream().collect(
                Collectors.toMap(Hosting::getName, Hosting::getWebsites,
                        (oldValue, newValue) -> newValue
                )
        );

输出:

result1:{liquidweb.com=80000, mkyong.com=1, digitalocean.com=120000, aws.amazon.com=200000, linode.com=100000}

3.List to Map – Sort & Collect

先排序再收集。

private static void testThree() {
    List<Hosting> list = new ArrayList<>();
    list.add(new Hosting(1, "liquidweb.com", 80000));
    list.add(new Hosting(2, "linode.com", 90000));
    list.add(new Hosting(3, "digitalocean.com", 120000));
    list.add(new Hosting(4, "aws.amazon.com", 200000));
    list.add(new Hosting(5, "mkyong.com", 1));
    list.add(new Hosting(6, "linode.com", 100000));

    // use oldValue
    Map<String, Long> result1 = list.stream().sorted(Comparator.comparingLong(Hosting::getWebsites).reversed())
        .collect(Collectors.toMap(Hosting::getName,Hosting::getWebsites,(oldValue, newValue) -> oldValue,
            LinkedHashMap::new));

    System.out.println("result1:" + result1);
  }

输出:

result1:{aws.amazon.com=200000, digitalocean.com=120000, linode.com=100000, liquidweb.com=80000, mkyong.com=1}

在上面的例子中,流是在收集之前排序的,所以“ linode. com 100000”变成了“ oldValue”。

源码见:java-8-demo

系列文章详见:Java 8 教程

欢迎关注

© 著作权归作者所有

山川尽美
粉丝 2
博文 20
码字总数 16237
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

JAX-WS传递自定义的Java类型

在之前的文章中,有实现一个图书馆的WebService。可以在这篇文章中http://my.oschina.net/xpbug/blog/224912 找到。 然而,之前的图书馆系统接口所接收的参数和返回的类型,都非常简单,只是...

xpbug
2014/04/30
2.9K
2
流,用声明性的方式处理数据集 - 读《Java 8实战》

引入流 Stream API的代码 声明性 更简洁,更易读 可复合 更灵活 可并行 性能更好 流是什么? 它允许以声明方式处理数据集合 遍历数据集的高级迭代器 透明地并行处理 简短定义:从支持数据处理...

yysue
2018/08/15
74
1
Gradle入门(一)--Groovy常用语法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/zly921112/article/details/90479841 概述 Groovy是一种可以用于构建...

zhuliyuan丶
2019/05/23
0
0
JAVA中list的泛型问题

比如 List lst = XXinstance.get("xx") 。假设 get这个方法返回的只是一个List 没有指定泛型,所以IDE中看不出来。 假设实际中是个Map,那么编码时我不知道。在编译的时候这里不报错,运行时...

Mr_Sky
2014/03/05
863
2
Excel4J v2.1.0版本更新,Java 快速操作 Excel 工具

java基于poi实现快速操作Excel的工具[v2.1.0]版本更新: v2.x新特性 Excel读取支持部分类型转换了(如转为Integer,Long,Date(部分)等) v2.0.0之前只能全部内容转为String Excel支持非注解读取E...

Crab2Died
2017/10/28
3K
7

没有更多内容

加载失败,请刷新页面

加载更多

何时使用vs ref vs out

前几天有人问我应该使用参数关键字out而不是ref 。 虽然我(我认为)理解了ref和out关键字之间的差异( 之前已经提到过 ),最好的解释似乎是ref == in and out ,什么是一些(假设的或代码的...

javail
34分钟前
51
0
宜信如何做到既满足远程办公的短时便利性需求,又不丧失安全性

对于IT互联网企业来说远程办公并不陌生,但是疫情的突然爆发,直接大规模的使用远程办公应用,势必会带来一系列的安全问题,尤其是大量隐私数据安全问题,因为此次的疫情,大量的企业内部人员...

宜信技术学院
39分钟前
45
0
如何获得元素的渲染高度?

如何获得元素的渲染高度? 假设您有一个<div>元素,其中包含一些内容。 内部的内容将扩展<div>的高度。 当您没有明确设置高度时,如何获得“渲染的”高度。 显然,我尝试过: var h = docume...

技术盛宴
49分钟前
40
0
zookeeper宕机与dubbo直连

加入zookeeper宕机后,一段时间内consumer依然能够获取provider的服务,实际上使用了本地缓存进行通讯,这也是dubbo健壮性的一种体验。 dubbo健壮性的表现: 1.监控中心宕机,不影响使用,只...

七宝1
50分钟前
44
0
一分钟了解【X-Frame-Options设置】

含义 通过设置X-Frame-Options来控制网页能否被frame或iframe嵌入。 目的 防止出现 点击劫持 :攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在网页上进行操作,此时用户将在...

crazymus
57分钟前
48
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部