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

如何从Map<String,Collection<Map<String,String>>>中提取指定值?

解决方法:提取A1对应的Item Number字符串列表

嘿,不用非得转JSON用JSONPath处理,直接操作这个Map集合其实更高效也更直接!我给你两种方案,你可以按需选择:

方案一:直接遍历集合(推荐)

既然你已经拿到了Map<String, Collection<Map<String, String>>>类型的对象,咱们可以直接逐层提取:

  1. 先从外层Map中获取A1对应的集合,记得先做非空判断,避免空指针异常;
  2. 遍历这个集合里的每个子Map,取出Item Number对应的字符串值,收集到列表里。

用Java代码实现的话,用Stream API会很简洁:

import java.util.*;
import java.util.stream.Collectors;

public class MapProcessing {
    public static void main(String[] args) {
        // 模拟你的原始Map数据
        Map<String, Collection<Map<String, String>>> originalMap = new HashMap<>();
        
        List<Map<String, String>> a1List = new ArrayList<>();
        a1List.add(Map.of("Item Number", "1234", "Tax Code", "1"));
        a1List.add(Map.of("Item Number", "2345", "Tax Code", "2"));
        a1List.add(Map.of("Item Number", "1234", "Tax Code", "1"));
        originalMap.put("A1", a1List);
        
        // 提取A1的Item Number列表
        List<String> itemNumbers = Optional.ofNullable(originalMap.get("A1"))
                .orElse(Collections.emptyList())
                .stream()
                // 如果担心子Map没有Item Number键,可以加个过滤:.filter(map -> map.containsKey("Item Number"))
                .map(map -> map.get("Item Number"))
                .collect(Collectors.toList());
        
        System.out.println(itemNumbers); // 输出: [1234, 2345, 1234]
        
        // 如果需要去重,把Collectors.toList()换成Collectors.toSet()再转List
        List<String> uniqueItemNumbers = new ArrayList<>(new HashSet<>(itemNumbers));
        System.out.println(uniqueItemNumbers); // 输出: [1234, 2345]
    }
}

如果不习惯Stream,用普通循环也很清晰:

List<String> itemNumbers = new ArrayList<>();
Collection<Map<String, String>> a1Collection = originalMap.get("A1");
if (a1Collection != null) {
    for (Map<String, String> itemMap : a1Collection) {
        String itemNum = itemMap.get("Item Number");
        if (itemNum != null) { // 避免null值混入列表
            itemNumbers.add(itemNum);
        }
    }
}

方案二:用JSONPath处理(如果你坚持这个思路)

如果你还是想转成JSON用JSONPath提取,步骤也很简单:

  1. 把原始Map序列化成JSON字符串(可以用Jackson、Gson等库);
  2. 用JSONPath表达式$['A1'][*]['Item Number']提取所有Item Number值。

示例代码(用Jackson和Jayway JSONPath):

import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;

public class JsonPathProcessing {
    public static void main(String[] args) throws Exception {
        Map<String, Collection<Map<String, String>>> originalMap = new HashMap<>();
        // 初始化数据同上...
        
        ObjectMapper mapper = new ObjectMapper();
        String jsonStr = mapper.writeValueAsString(originalMap);
        
        List<String> itemNumbers = JsonPath.read(jsonStr, "$['A1'][*]['Item Number']");
        System.out.println(itemNumbers); // 同样输出: [1234, 2345, 1234]
    }
}

不过要注意,这种方法需要额外引入JSON处理的依赖,而且序列化/反序列化会有一定性能开销,所以如果只是简单提取的话,方案一更划算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:29:49