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
相关产品推荐
相关产品推荐

