【Stream】讲常见数据结构转为map<String,Long>

1. 集合 → 转成 Map<String, Long>(最常用)

场景:对象集合 → key = 名称,value = 数量 / ID

复制代码
// 1. 准备一个实体类
@Data
class Product {
    private String name;  // String 类型 key
    private Long stock;   // Long 类型 value
}

// 2. 构造数据
List<Product> list = List.of(
    new Product("苹果", 100L),
    new Product("香蕉", 200L),
    new Product("橙子", 300L)
);

// 3. Stream 转 Map<String, Long>
Map<String, Long> map = list.stream()
    .collect(Collectors.toMap(
        Product::getName,    // key:String
        Product::getStock,   // value:Long
        (oldVal, newVal) -> oldVal // 重复 key 解决方案
    ));

2. List<String> → 统计次数 → Map<String, Long>

场景:统计字符串出现次数

复制代码
List<String> list = List.of("苹果", "苹果", "香蕉", "橙子", "香蕉");

Map<String, Long> countMap = list.stream()
    .collect(Collectors.groupingBy(
        item -> item,          // key
        Collectors.counting()   // value:Long 类型计数
    ));

结果:{苹果=2, 香蕉=2, 橙子=1}


3. 数组 / List → 自己指定 key 和 value

java

运行

复制代码
List<User> list = ...;

Map<String, Long> map = list.stream()
    .collect(Collectors.toMap(
        User::getUsername,    // String key
        User::getId,          // Long value
        (v1, v2) -> v1        // 重复 key 保留旧值
    ));

4. 按字段分组 → 求和 → Map<String, Long>

场景:按商品名称统计总库存(超级常用)

java

运行

复制代码
Map<String, Long> stockSumMap = list.stream()
    .collect(Collectors.groupingBy(
        Product::getName,
        Collectors.summingLong(Product::getStock)
    ));

5. 过滤后再转 Map

java

运行

复制代码
Map<String, Long> map = list.stream()
    .filter(p -> p.getStock() > 0)
    .collect(Collectors.toMap(
        Product::getName,
        Product::getStock,
        (o, n) -> o
    ));

6. 解决重复 key 报错(必须掌握)

如果有重复 name,会报错,必须加:

java

运行

复制代码
(oldVal, newVal) -> oldVal   // 保留旧值
// 或
(oldVal, newVal) -> newVal   // 覆盖旧值

✔ 3 句万能口诀

  1. 对象集合 → toMap (key, value)
  2. 统计次数 → groupingBy + counting ()
  3. 分组求和 → groupingBy + summingLong ()
相关推荐
阿耶同学37 分钟前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田17 小时前
Pydantic校验配置文件
python
hboot17 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
ZhengEnCi1 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi1 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽1 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
用户8358086187911 天前
基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
python
Warson_L2 天前
Python `Annotated` 与 LangGraph Reducer 学习笔记
python
韩师傅2 天前
海天线算法的前世今生
python·计算机视觉