You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream lambda表达式处理字符串转HashMap时如何去除List内重复值

解决方案

写法1:优化整体流处理逻辑(推荐)

直接在收集阶段完成去重,省去后续遍历写入HashMap的步骤:

String myStrFromUser = "app0=aaa,aaa,app1=ccc,ddd,app3=ddd,app4=iii,ddd,qqq,www,iii";
private static HashMap<String, List<String>> myMap = new HashMap<>();

myMap = Arrays.stream(myStrFromUser.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
        .map(String::trim)
        .map(s -> s.split("="))
        .collect(Collectors.toMap(
                strArr -> strArr[0],
                // 拆分value后直接通过distinct去重再收集为List
                strArr -> Arrays.stream(strArr[1].split(","))
                        .distinct()
                        .collect(Collectors.toList()),
                // 可选配置:遇到重复key时保留先出现的value,避免抛异常
                (oldVal, newVal) -> oldVal,
                // 直接指定生成HashMap,无需后续转换
                HashMap::new
        ));

写法2:兼容原有代码逻辑

如果不想修改原有collect的写法,只需要修改forEach中put的逻辑即可:

Arrays.stream(myStrFromUser.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
        .map(String::trim)
        .map(s -> s.split("="))
        .collect(Collectors.toMap(strArr -> strArr[0], strArr -> strArr[1].split(",")))
        // 拆分后的value数组转流去重后再存入HashMap
        .forEach((key, value) -> myMap.put(key, Arrays.stream(value).distinct().collect(Collectors.toList())));

核心说明

  • 去重的核心逻辑是通过Arrays.stream(value).distinct()实现,Stream的distinct方法会自动去除数组中的重复元素,保留元素第一次出现的顺序。
  • 写法1额外补充了toMap的合并策略和返回类型配置,避免遇到重复key时抛出非法状态异常,性能也更优。

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:39:03