如何使用Vavr将List<Map<String,Object>>合并为单个Map<String,Object>
Vavr List
基础实现(键冲突默认后值覆盖前值)
直接使用Vavr原生的reduce+merge组合即可完成合并,代码如下:
import io.vavr.collection.List; import io.vavr.collection.Map; public class MapMergeExample { public static void main(String[] args) { // 测试数据源:Vavr List 包含多个Vavr Map List<Map<String, Object>> listOfMaps = List.of( Map.of("userName", "李明", "gender", "男", "age", 24), Map.of("department", "技术部", "age", 25), // age键重复,默认取后值25 Map.of("post", "后端开发工程师") ); // 核心合并逻辑 Map<String, Object> mergedMap = listOfMaps.reduce( Map.empty(), // 初始空累加器 (acc, currentMap) -> acc.merge(currentMap) ); // 输出结果:HashMap(userName -> 李明, gender -> 男, age -> 25, department -> 技术部, post -> 后端开发工程师) System.out.println(mergedMap); } }
自定义键冲突处理实现
如果需要自己定义键重复时的处理逻辑,可以使用带冲突处理函数的merge重载方法:
// 示例:键冲突时将新旧值用竖线拼接 Map<String, Object> customMergedMap = listOfMaps.reduce( Map.empty(), (acc, currentMap) -> acc.merge( currentMap, // 冲突处理函数:入参为旧值、新值,返回处理后的最终值 (oldVal, newVal) -> oldVal + "|" + newVal ) ); // 此时age字段值为 "24|25"
注意事项
- 确保代码中导入的
List、Map都是io.vavr.collection包下的实现,不要和JDK原生java.util包下的集合类混用 - 如果需要在出现重复键时抛出异常,只需将冲突处理函数修改为抛出异常即可:
(oldVal, newVal) -> {throw new RuntimeException("存在重复键,值冲突:" + oldVal + " / " + newVal);}
内容的提问来源于stack exchange,提问作者Stefan Dierichs
相关产品推荐
相关产品推荐

