java8 stream list转map及问题解决

测试代码如下:

public class StreamUtil {
    public static void main(String[] args) {
   //List集合
        List<Test> list = new ArrayList();
        list.add(new Test("01", "A"));
        list.add(new Test("02", "B"));
        list.add(new Test("02", "c"));
        System.out.println(list);
        //list转换map
//Map<String, Test> map = list.stream().collect(Collectors.toMap(Test::getId, p -> p));
        // Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName));
        // Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key2 ));
        
		Map<String, Test> map = list.stream().collect(Collectors.toMap(Test::getId, a -> a,(k1,k2)->k1));
        Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName, (key1, key2) -> key1 + "," + key2));
        /*Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Test::getId,
                p -> {
                    List<String> getNameList = new ArrayList<>();
                    getNameList.add(p.getName());
                    return getNameList;
                },
                (List<String> value1, List<String> value2) -> {
                    value1.addAll(value2);
                    return value1;
                }
        ));*/
        System.out.println("list转换map:" + map);
        System.out.println("list转换map:" + map.get("02"));
        System.out.println(Arrays.asList(map.get("02").split(",")));
    }
    public static class Test {
        String id;
        String name;
        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;
        }
        public Test() {
            super();
        }
        public Test(String id, String name) {
            this.id = id;
            this.name = name;
        }
    }
}

结果:

list转换map:{01=A, 02=B}

此时list中再加入重复的数据则会报错

list.add(new Test("02", "B"));
list.add(new Test("02", "C"));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xozdAvDi-1624699037760)(http://www.niuhaha.monster:8090/upload/2021/04/image-3f9ac556641c4cbf91297c3e03916680.png)]

解决:

1.重复时用后面的value 覆盖前面的value

Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key2 ));

list转换map:{01=A, 02=C}

2.重复时将前面的value 和后面的value拼接起来

Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getId, Test::getName,(key1 , key2)-> key1+","+key2 ));

list转换map:{01=A, 02=B,C}

3.重复时将重复key的数据组成集合

Map<String, List<String>> map = list.stream().collect(Collectors.toMap(Test::getId,
                p -> {
                    List<String> getNameList = new ArrayList<>();
                    getNameList.add(p.getName());
                    return getNameList;
                },
                (List<String> value1, List<String> value2) -> {
                    value1.addAll(value2);
                    return value1;
                }
        ));

list转换map:{01=[A], 02=[B, c]}

或者将2中结果提取出来按“,”截取成集合也可.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值