前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8之Stream之List转Map有哪些坑

Java8之Stream之List转Map有哪些坑

作者头像
王小明_HIT
修改2021-09-09 13:45:20
5.2K0
修改2021-09-09 13:45:20
举报
文章被收录于专栏:程序员奇点程序员奇点

Duplicate key 问题

当 key 值重复时会有这个问题,异常如下

代码语言:javascript
复制
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 小C
	at java.util.stream.Collectors.lambda$throwingMerger$0(Unknown Source)
	at java.util.HashMap.merge(Unknown Source)
	at java.util.stream.Collectors.lambda$toMap$58(Unknown Source)
	at java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.collect(Unknown Source)
	at JavaBase.lamda.List2Map.main(List2Map.java:47)

Duplicate key 解决办法一:遇到重复的key就使用后者替换
代码语言:javascript
复制
// 后面的值代替之前的值
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1 , value2)-> value2 ));
Duplicate key 解决办法二:重复时将前面的value和后面的value拼接起来
代码语言:javascript
复制
// 重复时将前面的value 和后面的value拼接起来
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1 , value2)-> value1+","+value2 ));

Duplicate key 解决办法三:重复时将重复key的数据组成集合

代码语言:javascript
复制
// 重复时将重复key的数据组成集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId, p -> {
            List<String> getNameList = new ArrayList<>();
            getNameList.add(p.getName());
            return getNameList;
        }, (List<String> value1, List<String> value2) -> {
            value1.addAll(value2);
            return value1;
        }));
NullPointerException 问题
代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
	at java.util.HashMap.merge(Unknown Source)
	at java.util.stream.Collectors.lambda$toMap$58(Unknown Source)
	at java.util.stream.ReduceOps$3ReducingSink.accept(Unknown Source)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.collect(Unknown Source)
	at JavaBase.lamda.List2Map.main(List2Map.java:47)

解决办法

代码语言:javascript
复制
Map<String, String> map = (Map<String, String>) list.stream().collect(HashMap::new,(k, v) ->k.put(v.getId(),v.getName()),HashMap::putAll);
Map类集合Key/Value能否存储null值情况表格

集合类

Key

Value

Super

说明

ConcurrentHashMap

不允许为null

不允许为null

AbstractMap

分段锁技术

Hashtable

不允许为null

不允许为null

Dictionary

线程安全

HashMap

允许为null

允许为null

AbstractMap

线程不安全

TreeMap

不允许为null

允许为null

AbstractMap

线程不安全

完整测试代码

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Person {
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    private String id;
    private String name;
    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

public class List2Map {

    public static void main(String[] args) {
        // 声明一个List集合
        List<Person> list = new ArrayList();
        list.add(new Person("1001", "小A"));
        list.add(new Person("1002", "小B"));
        list.add(new Person("1003", "小C"));
//        list.add(new Person("1003", "小D"));
        list.add(new Person("1004", null));
//        list.add(new Person(null, "小D"));
        // 将list转换map
        Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
        // 后面的值代替之前的值
//        Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1 , value2)-> value2 ));
        // 重复时将前面的value 和后面的value拼接起来
//        Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(value1 , value2)-> value1+","+value2 ));
        // 重复时将重复key的数据组成集合
      /*  Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Person::getId, p -> {
            List<String> getNameList = new ArrayList<>();
            getNameList.add(p.getName());
            return getNameList;
        }, (List<String> value1, List<String> value2) -> {
            value1.addAll(value2);
            return value1;
        }));*/
        
//        Map<String, String> map = (Map<String, String>) list.stream().collect(HashMap::new,(k, v) ->k.put(v.getId(),v.getName()),HashMap::putAll);
        System.out.println(map);
    }
}

欢迎关注公众号:程序员财富自由之路

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Duplicate key 问题
    • Duplicate key 解决办法一:遇到重复的key就使用后者替换
      • Duplicate key 解决办法二:重复时将前面的value和后面的value拼接起来
        • NullPointerException 问题
          • Map类集合Key/Value能否存储null值情况表格
          • 完整测试代码
          • 欢迎关注公众号:程序员财富自由之路
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档