栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

List转Map时把重复的value合并成List

Java 更新时间:发布时间: 百科书网 趣学号
分享知识 传递快乐

描述:

取List集合中两个字段,将一两个字段作为key、value,利用Steam流转为map集合,当key相同时,将value转为List集合。

代码1:

package com.demo;

import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class AppDemo {

    public static void main(String[] args) {
        List list = Lists.newArrayList(1, 7, 2, 5, 3, 4, 5, 1, 3, 6, 7);
        Map> map = list.stream().collect(Collectors.toMap(key -> key, value -> Lists.newArrayList(value),
                (List newValueList, List oldValueList) -> {
                    oldValueList.addAll(newValueList);
                    return oldValueList;
                }));
        System.out.println(JSONUtil.toJsonStr(map));
    }

}

结果:

{"1":[1,1],"2":[2],"3":[3,3],"4":[4],"5":[5,5],"6":[6],"7":[7,7]}

代码2:

package com.demo;

import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import lombok.Data;

import java.util.*;
import java.util.stream.Collectors;

public class AppDemo {

    public static void main(String[] args) {
        List list = new linkedList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new Menu(1L, 0L, "菜单1"));
            list.add(new Menu(2L, 1L, "菜单2"));
            list.add(new Menu(3L, 1L, "菜单3"));
            list.add(new Menu(4L, 2L, "菜单4"));
            list.add(new Menu(5L, 3L, "菜单5"));
            list.add(new Menu(6L, 3L, "菜单6"));
        }

        Map> map = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> new HashSet<>(Arrays.asList(item.getId())),
                (Set newValueList, Set oldValueList) -> {
                    oldValueList.addAll(newValueList);
                    return oldValueList;
                })
        );
        System.out.println(JSONUtil.toJsonStr(map));

        Map> map2 = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> Lists.newArrayList(item),
                (List newValueList, List oldValueList) -> {
                    oldValueList.addAll(newValueList);
                    return oldValueList;
                })
        );
        System.out.println(JSONUtil.toJsonStr(map2));


        // KEY重复问题
        // 获取值
        Map map3 = list.stream().collect(Collectors.toMap(Menu::getParentId, Menu::getName, (k1, k2) -> k1));
        System.out.println(JSONUtil.toJsonStr(map3));

        map3 = list.stream().collect(Collectors.toMap(Menu::getParentId, Menu::getName, (k1, k2) -> k2));
        System.out.println(JSONUtil.toJsonStr(map3));
        
        // 获取对象
        Map map4 = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> item, (k1, k2) -> k2));
        System.out.println(JSONUtil.toJsonStr(map4));

        map4 = list.stream().collect(Collectors.toMap(Menu::getParentId, Function.identity(), (k1, k2) -> k2));
        System.out.println(JSONUtil.toJsonStr(map4));

    }

}

@Data
class Menu {
    private Long id;
    private Long parentId;
    private String name;

    public Menu(Long id, Long parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }
}

结果:

{"0":[1],"1":[2,3],"2":[4],"3":[5,6]}
{"0":[{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1},{"parentId":0,"name":"菜单1","id":1}],"1":[{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2},{"parentId":1,"name":"菜单3","id":3},{"parentId":1,"name":"菜单2","id":2}],"2":[{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4},{"parentId":2,"name":"菜单4","id":4}],"3":[{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5},{"parentId":3,"name":"菜单6","id":6},{"parentId":3,"name":"菜单5","id":5}]}
{"0":"菜单1","1":"菜单2","2":"菜单4","3":"菜单5"}
{"0":"菜单1","1":"菜单3","2":"菜单4","3":"菜单6"}
{"0":{"parentId":0,"name":"菜单1","id":1},"1":{"parentId":1,"name":"菜单3","id":3},"2":{"parentId":2,"name":"菜单4","id":4},"3":{"parentId":3,"name":"菜单6","id":6}}
{"0":{"parentId":0,"name":"菜单1","id":1},"1":{"parentId":1,"name":"菜单3","id":3},"2":{"parentId":2,"name":"菜单4","id":4},"3":{"parentId":3,"name":"菜单6","id":6}}

关于 Collectors.toMap 方法

Collectors.toMap 有三个重载方法:

toMap(Function keyMapper, Function valueMapper);

toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction);

toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier);

参数含义分别是:

  • keyMapper:Key 的映射函数
  • valueMapper:Value 的映射函数
  • mergeFunction:当 Key 冲突时,调用的合并方法
  • mapSupplier:Map 构造器,在需要返回特定的 Map 时使用

—————————
如有不足请留言指正
相互学习,共同进步

转载请注明:文章转载自 www.051e.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号