Java List<Map>合并同key map中value

需积分: 50 59 下载量 84 浏览量 更新于2024-09-01 1 收藏 1KB TXT 举报
在Java中,当我们处理一个包含多个Map的List,且这些Map之间具有相同的键值对(key-value对),例如都包含"Apple"、"Banana"等键,但每个Map对应不同的其他键值时,我们可能需要将这些具有相同键的记录的其他键的值进行合并。这种场景通常发生在数据处理或者数据清洗的过程中,为了简化或统一数据结构。 首先,我们导入所需的Java集合框架类,如ArrayList、HashMap、Optional、Stream和Collectors。在`classListOfMapsMerge`类的`main`方法中,我们创建了三个Map实例,每个Map都有不同的键值对组合。然后,我们将这三个Map放入一个ArrayList`mapList`中,以便后续操作。 接下来,我们使用Java 8的Stream API来处理这个列表。`mapList.stream().reduce()`函数用于将列表中的所有Map进行归约操作,目标是合并具有相同键的Map。这里使用了Lambda表达式 `(firstMap, secondMap) -> { ... }`,该表达式接收两个参数:当前处理的Map(firstMap)和下一个Map(secondMap)。 在Lambda内部,我们首先通过`.entrySet().stream()`获取每个Map的键值对流,然后使用`Stream.concat()`将它们连接起来。接着,`collect(Collectors.toMap(...))`方法接收三个参数: 1. `Map.Entry::getKey` 表示使用键作为新的Map的键。 2. `Map.Entry::getValue` 表示使用值作为新的Map的值。 3. `(countInFirstMap, countInSecondMap) -> countInFirstMap + countInSecondMap` 是合并策略,当遇到相同的键时,将第一个Map的值与第二个Map的值相加。 最后,`reduce`方法返回的是一个Optional<Map<String, Long>>,因为如果列表为空或没有找到相同的键,则结果可能是空的。我们通过`.ifPresent()`检查Optional是否非空,如果非空,就将其内容添加到一个新的ArrayList<Map<String, Long>>`resultList`中。 总结来说,这段代码展示了如何使用Java 8的Stream API和Lambda表达式对List<Map>中的Map进行按键合并其他键值的操作,实现了对具有相同键的记录的其他键值的累加合并。这种方式在数据处理或数据分析中非常有用,可以方便地统一和清理数据结构。