Java中将Map键转为小写时合并对应值集合的简便实现方法有哪些?
优化实现方案
方案1:用computeIfAbsent简化原有循环(Java 8+ 兼容,可读性最优)
借助Map内置的computeIfAbsent方法可以省去手动判断键是否存在的逻辑,代码大幅精简:
Map<String, Set<String>> result = new HashMap<>(); map.forEach((key, value) -> { String lowerKey = key.toLowerCase(); Set<String> lowerValues = value.stream() .map(String::toLowerCase) .collect(Collectors.toSet()); result.computeIfAbsent(lowerKey, k -> new HashSet<>()) .addAll(lowerValues); });
方案2:纯Stream流式实现
如果偏好函数式写法,可以直接用流收集器一步生成结果:
Java 9+版本(支持flatMapping收集器,代码更简洁)
Map<String, Set<String>> result = map.entrySet().stream() .collect(Collectors.groupingBy( entry -> entry.getKey().toLowerCase(), Collectors.flatMapping( entry -> entry.getValue().stream().map(String::toLowerCase), Collectors.toSet() ) ));
Java 8兼容版本
用toMap的合并函数处理重复小写键的集合合并逻辑:
Map<String, Set<String>> result = map.entrySet().stream() .collect(Collectors.toMap( entry -> entry.getKey().toLowerCase(), entry -> entry.getValue().stream() .map(String::toLowerCase) .collect(Collectors.toSet()), (existSet, currSet) -> { existSet.addAll(currSet); return existSet; } ));
小提示:如果程序需要适配多语言环境,建议调用
toLowerCase(Locale.ROOT)替代无参方法,避免部分语言环境下字符转换不符合预期的问题。
内容的提问来源于stack exchange,提问作者BlueDolphin
相关产品推荐
相关产品推荐

