在Java中,Collectors.toMap
是 Stream API 中的一个非常有用的收集器,它允许你将流中的元素收集到一个 Map 中。当你想要使用枚举作为键时,你需要确保枚举类型正确地实现了 hashCode
和 equals
方法,因为这些方法在 Map 中用于确定键的唯一性。
枚举(Enum):Java 中的枚举是一种特殊的类,它代表了一组固定的常量。枚举类型在 Java 中是通过 enum
关键字定义的。
Stream API:Java 8 引入的 Stream API 提供了一种高效且易于并行处理集合数据的方式。Stream 不是数据结构,它不会存储元素,而是按需计算。
Collectors.toMap:这是一个终端操作,它将流中的元素收集到一个 Map 中。你可以指定键和值的映射函数,以及合并函数(在键冲突时使用)。
Collectors.toMap
可以使代码更加简洁和易读。类型:Collectors.toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction)
keyMapper
:将流中的元素映射到键。valueMapper
:将流中的元素映射到值。mergeFunction
:当遇到重复键时,合并旧值和新值的函数。应用场景:
假设我们有一个枚举 Color
和一个类 Fruit
,我们想要创建一个映射,其中键是颜色枚举,值是具有该颜色的水果列表。
import java.util.*;
import java.util.stream.Collectors;
enum Color {
RED, GREEN, YELLOW;
}
class Fruit {
private String name;
private Color color;
public Fruit(String name, Color color) {
this.name = name;
this.color = color;
}
public Color getColor() {
return color;
}
@Override
public String toString() {
return name;
}
}
public class Main {
public static void main(String[] args) {
List<Fruit> fruits = Arrays.asList(
new Fruit("Apple", Color.RED),
new Fruit("Banana", Color.YELLOW),
new Fruit("Pear", Color.GREEN),
new Fruit("Cherry", Color.RED)
);
Map<Color, List<Fruit>> fruitsByColor = fruits.stream()
.collect(Collectors.groupingBy(Fruit::getColor));
System.out.println(fruitsByColor);
}
}
问题:当使用枚举作为键时,如果流中有重复的键,Collectors.toMap
会抛出 IllegalStateException
。
原因:默认情况下,Collectors.toMap
不允许键重复。如果遇到重复的键,它会尝试合并值,但如果没有提供合并函数,就会抛出异常。
解决方法:提供一个合适的合并函数,或者使用 Collectors.groupingBy
来分组而不是创建一个 Map。
Map<Color, List<Fruit>> fruitsByColor = fruits.stream()
.collect(Collectors.groupingBy(Fruit::getColor));
这样,每个颜色的水果都会被收集到一个列表中,而不是抛出异常。
以上就是关于在 Java Stream API 中使用枚举作为键的 Collectors.toMap
的详细解释和示例代码。
云+社区技术沙龙[第11期]
云+社区技术沙龙 [第30期]
北极星训练营
企业创新在线学堂
高校公开课
云+社区技术沙龙[第27期]
Techo Day
领取专属 10元无门槛券
手把手带您无忧上云