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 句万能口诀
- 对象集合 → toMap (key, value)
- 统计次数 → groupingBy + counting ()
- 分组求和 → groupingBy + summingLong ()