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

Java中如何对String数组构成的List使用Stream和Map实现分组求和?

解决方案

完全可以通过Stream结合Map实现该需求,具体实现逻辑如下:


实现步骤

  1. 先定义品名到品类的映射规则,用于快速匹配每个商品所属的大类
  2. 对原始List<String[]>做流式处理,按品类分组并累加对应商品的数量
  3. 将分组求和后的结果转换为List<String[]>格式返回

完整代码示例

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

public class CategorySumTest {
    public static void main(String[] args) {
        // 原始数据
        List<String[]> items = List.of(
            new String[] {"Apple", "20"},
            new String[] {"Orange", "15"},
            new String[] {"Tomato", "25"}
        );

        // 1. 定义品名->品类的映射规则
        Map<String, String> categoryMapping = Map.of(
            "Apple", "fruits",
            "Orange", "fruits",
            "Tomato", "vegetables"
        );

        // 2. 流式处理实现分组求和+格式转换
        List<String[]> result = items.stream()
            // 按品类分组,对对应数量求和
            .collect(Collectors.groupingBy(
                arr -> categoryMapping.get(arr[0]),
                Collectors.summingInt(arr -> Integer.parseInt(arr[1]))
            ))
            // 把分组结果转成要求的List<String[]>格式
            .entrySet()
            .stream()
            .map(entry -> new String[]{entry.getKey(), String.valueOf(entry.getValue())})
            .toList();

        // 测试输出验证结果
        result.forEach(arr -> System.out.printf("[\"%s\", \"%s\"]%n", arr[0], arr[1]));
    }
}

补充说明

如果存在未在映射规则中定义的品名,可以调整映射取值逻辑增加兜底分类,避免返回null:

// 把分组的key取值逻辑改成getOrDefault,未匹配的归类为other
arr -> categoryMapping.getOrDefault(arr[0], "other")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:45:01