List<Map<TemplateTypeEnum,List<String>>> java stream 根据map的key分组
时间: 2025-03-18 22:19:10 浏览: 46
### 使用 Stream 对 Map 按 Key 进行分组
在 Java 中,可以通过 `Stream` 和 `Collectors.groupingBy` 方法来实现对复杂数据结构(如 `Map<K,V>` 或嵌套列表)的分组操作。以下是针对问题的具体解决方案。
假设有一个输入数据结构如下:
```java
List<Map<TemplateTypeEnum, List<String>>> example;
```
目标是对该数据中的键 (`TemplateTypeEnum`) 进行分组并统计其对应的值集合大小或其他属性。下面是一个完整的代码示例[^1]:
#### 实现代码
```java
import java.util.*;
import java.util.stream.Collectors;
public class GroupByExample {
public static void main(String[] args) {
// 假设 TemplateTypeEnum 是一个枚举类型
enum TemplateTypeEnum {
TYPE_A, TYPE_B, TYPE_C
}
// 构造测试数据
List<Map<TemplateTypeEnum, List<String>>> example = Arrays.asList(
Map.of(TemplateTypeEnum.TYPE_A, Arrays.asList("A1", "A2")),
Map.of(TemplateTypeEnum.TYPE_B, Arrays.asList("B1")),
Map.of(TemplateTypeEnum.TYPE_A, Arrays.asList("A3"))
);
// 将数据流化并对 TemplateTypeEnum 进行分组
Map<TemplateTypeEnum, Integer> groupedResult = example.stream()
.flatMap(map -> map.entrySet().stream()) // 展平为 Entry 流
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.summingInt(entry -> entry.getValue().size())
));
// 输出结果
System.out.println(groupedResult);
}
}
```
上述代码实现了以下功能:
- 首先通过 `example.stream()` 创建了一个流对象。
- 利用 `flatMap` 将每个 `Map` 的条目展平成单独的 `Entry<KEY, VALUE>` 形式。
- 接着调用了 `groupingBy` 来基于 `Key` (即 `TemplateTypeEnum` 类型)进行分组,并计算对应值的数量总和[^3]。
最终输出的结果类似于这样:
```plaintext
{TYPE_A=3, TYPE_B=1}
```
这表示对于所有的记录而言,“TYPE_A”的总数为 3 而 “TYPE_B” 只有 1。
---
如果还需要进一步扩展此逻辑以处理更复杂的场景或者自定义比较器,则可参考其他资料[^4] 如何创建特定类型的 Comparator 并将其应用于排序过程之中。
---
###
阅读全文
相关推荐


















