Java中如何对String数组构成的List使用Stream和Map实现分组求和?
解决方案
完全可以通过Stream结合Map实现该需求,具体实现逻辑如下:
实现步骤
- 先定义品名到品类的映射规则,用于快速匹配每个商品所属的大类
- 对原始
List<String[]>做流式处理,按品类分组并累加对应商品的数量 - 将分组求和后的结果转换为
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
相关产品推荐
相关产品推荐

