Collectors.toMap()
是 Java 中 Stream API 提供的一个终端收集器,用于将流中的元素转换为 Map。让我们分解你的 Collectors.toMap()
例子并逐步解释它。
方法签名
Collectors.toMap()
有多种重载版本,最常见的有以下两种:
-
Basic Version:
toMap(Function keyMapper, Function valueMapper)
keyMapper
:用于提取键的函数。valueMapper
:用于提取值的函数。
-
Version with Merge Function:
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
keyMapper
:用于提取键的函数。valueMapper
:用于提取值的函数。mergeFunction
:当多个元素产生相同的键时,用于解决冲突的合并函数。
例子中的用法
Collectors.toMap(x -> x.getBusId(), x -> x, (k1, k2) -> k1)
-
x -> x.getBusId()
:
这是keyMapper
函数,它指定了如何从每个流元素x
提取键。在这个例子中,假设x
是某种对象,getBusId()
是该对象的一个方法,它返回一个值,该值将用作 Map 中的键。 -
x -> x
:
这是valueMapper
函数,它指定了如何从每个流元素x
提取值。在这个例子中,它简单地返回流中的元素本身,表示将流中的对象作为 Map 的值。 -
(k1, k2) -> k1
:
这是mergeFunction
函数,当两个元素的键相同时,toMap
会调用该函数来决定保留哪一个值。在这个例子中,如果发生键冲突,它将保留第一个值k1
,并忽略第二个值k2
。
详细解释
假设我们有一个类 Bus
,并且我们有一个 List<Bus>
,我们想将它转换为一个 Map,其中 busId
作为键,Bus
对象本身作为值。假设列表中可能存在多个具有相同 busId
的 Bus
对象,我们可以使用这个 Collectors.toMap()
来进行转换。
List<Bus> buses = ...;
Map<Integer, Bus> busMap = buses.stream()
.collect(Collectors.toMap(
bus -> bus.getBusId(), // 使用 busId 作为 Map 的键
bus -> bus, // 使用 Bus 对象本身作为 Map 的值
(existingBus, newBus) -> existingBus // 如果有相同的键,保留第一个 Bus 对象
));
总结
keyMapper (x -> x.getBusId())
: 指定从对象x
中提取busId
作为 Map 的键。valueMapper (x -> x)
: 指定 Map 的值为对象x
本身。mergeFunction ((k1, k2) -> k1)
: 如果有重复的键,保留第一个对象k1
,忽略第二个对象k2
。
通过这种方式,你可以将流中的元素转换为键值对,处理可能的键冲突情况。