You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Stream中使用flatMap展平HashMap的列表值为单个列表

使用Java Stream的flatMap实现列表扁平化

问题场景

现有如下Java代码定义的Map列表:

List<Map<String, Object>> list = new ArrayList();
Map<String, Object> map1 = new HashMap();
List<String> values = new ArrayList();
values.add("TEST");
values.add("TEST1");
map1.put("level", values);
Map<String, Object> map2 = new HashMap();
List<String> values2 = new ArrayList();
values2.add("TEST2");
values2.add("TEST3");
map2.put("level", values2);
list.add(map1);
list.add(map2);

需要将其转换为一个扁平化的字符串列表,最终结果如下:

List<String> values = ["TEST","TEST1","TEST2","TEST3"]

实现方案

可以通过Java Stream的flatMap方法实现该需求,核心是将每个Map中对应的列表元素"摊平"后收集到一个新列表中,代码示例如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<Map<String, Object>> list = new ArrayList();
        Map<String, Object> map1 = new HashMap();
        List<String> values = new ArrayList();
        values.add("TEST");
        values.add("TEST1");
        map1.put("level", values);
        Map<String, Object> map2 = new HashMap();
        List<String> values2 = new ArrayList();
        values2.add("TEST2");
        values2.add("TEST3");
        map2.put("level", values2);
        list.add(map1);
        list.add(map2);

        // 核心实现代码
        List<String> flatValues = list.stream()
                .map(map -> (List<String>) map.get("level"))
                .flatMap(List::stream)
                .collect(Collectors.toList());

        System.out.println(flatValues); // 输出: [TEST, TEST1, TEST2, TEST3]
    }
}

代码解释

  1. list.stream():将原始的List<Map<String, Object>>转换为Stream流,开启流式操作。
  2. map(map -> (List<String>) map.get("level")):对每个Map对象,提取key为"level"对应的List<String>元素(因Map值类型为Object,需强制类型转换)。
  3. flatMap(List::stream):调用flatMap将每个List<String>转换为Stream<String>,并把所有子流合并成一个单一的Stream<String>,完成扁平化操作。
  4. collect(Collectors.toList()):将扁平化后的Stream<String>收集为最终的List<String>。

健壮性优化

如果Map中可能存在key为"level"但值不是List<String>,或值为null的情况,建议添加校验避免异常:

List<String> flatValues = list.stream()
        .map(map -> map.get("level"))
        .filter(obj -> obj instanceof List<?>)
        .map(obj -> (List<String>) obj)
        .filter(listObj -> !listObj.isEmpty())
        .flatMap(List::stream)
        .collect(Collectors.toList());

内容的提问来源于stack exchange,提问作者Nishant Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:31:21