【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 ()
相关推荐
故事和你913 分钟前
蓝桥杯-2025年C++B组国赛
开发语言·软件测试·数据结构·c++·算法·职场和发展·蓝桥杯
派大星~课堂10 分钟前
【力扣-138. 随机链表的复制 ✨】Python笔记
python·leetcode·链表
王忘杰12 分钟前
0基础CUDA炼丹、增加断点保存,从零开始训练自己的AI大模型 87owo/EasyGPT Python CUDA
开发语言·人工智能·python
数据知道14 分钟前
claw-code 源码详细分析:`reference_data` JSON 快照——大型移植里「对照底稿」该怎么治理与演进?
linux·python·ubuntu·json·claude code
cpp_250115 分钟前
P10108 [GESP202312 六级] 闯关游戏
数据结构·c++·算法·动态规划·题解·洛谷·gesp六级
好家伙VCC15 分钟前
**发散创新:基于以太坊侧链的高性能去中心化应用部署实战**在区块链生态中,*
java·python·去中心化·区块链
Lzh编程小栈19 分钟前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
瞭望清晨30 分钟前
Python多进程使用场景
开发语言·python
sR916Mecz32 分钟前
pache Hop实战:Windows平台MySQL数据迁移的深度排错与性能调优
数据库·windows·mysql
汀、人工智能35 分钟前
[特殊字符] 第102课:添加与搜索单词
数据结构·算法·均值算法·前缀树·trie·添加与搜索单词