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

分享知识 传递快乐

描述:

取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<Integer> list = Lists.newArrayList(1, 7, 2, 5, 3, 4, 5, 1, 3, 6, 7);
        Map<Integer, List<Integer>> map = list.stream().collect(Collectors.toMap(key -> key, value -> Lists.newArrayList(value),
                (List<Integer> newValueList, List<Integer> 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<Menu> 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<Long, Set<Long>> map = list.stream().collect(Collectors.toMap(Menu::getParentId, item -> new HashSet<>(Arrays.asList(item.getId())),
                (Set<Long> newValueList, Set<Long> oldValueList) -> {
                    oldValueList.addAll(newValueList);
                    return oldValueList;
                })
        );
        System.out.println(JSONUtil.toJsonStr(map));

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


        // KEY重复问题
        // 获取值
        Map<Long, String> 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<Long, Menu> 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<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);

toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction);

toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

参数含义分别是:

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

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

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ListMap合并value的步骤如下: 1. 首先,你需要创建一个List,其中包含你要换为Map的元素。 2. 使用Java 8的Stream流,通过调用`collect(Collectors.toMap())`方法将List换为Map。在`toMap()`方法中,你需要提供一个lambda表达式来指定key和value的生方式。 3. 在lambda表达式中,你可以将`key`设置为你希望作为Map的key的字段,将`value`设置为你希望作为Mapvalue的字段。 4. 在`toMap()`方法的第三个参数中,你可以提供一个lambda表达式来处理当key相同的情况。这个lambda表达式接收两个参数,分别是新value和旧value。你可以在这个lambda表达式中将新value添加到旧value中,然后返回合并后的值。 5. 最后,你可以使用`JSONUtil.toJsonStr()`方法将得到的Map换为JSON字符串。 下面是一个示例代码,演示了如何将List换为Map合并value: ```java 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<Integer> list = Lists.newArrayList(1, 7, 2, 5, 3, 4, 5, 1, 3, 6, 7); Map<Integer, List<Integer>> map = list.stream() .collect(Collectors.toMap( key -> key, value -> Lists.newArrayList(value), (newValueList, oldValueList) -> { oldValueList.addAll(newValueList); return oldValueList; } )); System.out.println(JSONUtil.toJsonStr(map)); } } ``` 这段代码将List `[1, 7, 2, 5, 3, 4, 5, 1, 3, 6, 7]` 换为Map,并将相同的key的value合并List。最终输出的结果为`{"1":[1,1],"2":,"3":[3,3],"4":,"5":[5,5],"6":,"7":[7,7]}`。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java中 Listmap》把里面map中某个key相同记录的其他key 的 value 合并 ](https://download.csdn.net/download/qq_26975307/12798166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ListMap重复value合并List](https://blog.csdn.net/xhaimail/article/details/120527032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值