collectors.tomap value为list
时间: 2025-06-22 12:38:55 浏览: 7
### Java 中使用 `Collectors.toMap` 将值收集到列表
当处理流操作并将结果映射到一个 `Map` 时,有时希望将具有相同键的多个条目聚合在一起形成列表。这可以通过自定义合并函数来实现,在遇到重复键时执行特定逻辑。
对于这种情况,可以利用 `Collectors.groupingBy` 或者通过提供第三个参数作为合并器给 `toMap` 方法。下面展示了一个例子,其中展示了如何创建一个 `Map<K, List<V>>` 结构:
```java
import java.util.*;
import java.util.stream.Collectors;
class Example {
public static void main(String[] args) {
List<Item> items = Arrays.asList(
new Item("apple", 10),
new Item("banana", 20),
new Item("orange", 30),
new Item("apple", 40)
);
Map<String, List<Integer>> itemPriceMap = items.stream()
.collect(Collectors.toMap(
Item::getName,
i -> Collections.singletonList(i.getPrice()),
(list1, list2) -> {
ArrayList<Integer> newList = new ArrayList<>(list1);
newList.addAll(list2);
return newList;
}
));
System.out.println(itemPriceMap); // 输出 {orange=[30], banana=[20], apple=[10, 40]}
}
static class Item {
private String name;
private Integer price;
public Item(String name, Integer price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public Integer getPrice() {
return price;
}
}
}
```
上述代码片段中,每当遇到相同的键(`Item.getName`)时,就会调用提供的二元运算符`(list1, list2)` 来组合两个列表并返回一个新的列表[^1]。
为了简化此过程,还可以考虑使用 `groupingBy` 收集器配合 `mapping` 和 `toList()`:
```java
Map<String, List<Integer>> itemPriceMapSimple = items.stream()
.collect(Collectors.groupingBy(Item::getName,
Collectors.mapping(Item::getPrice, Collectors.toList())));
```
这种方式更加简洁明了,并且避免了手动编写复杂的合并逻辑[^4]。
阅读全文
相关推荐

















