java Stream 流式处理之 Collectors.toMap()

Collectors.toMap() 是 Java 中 Stream API 提供的一个终端收集器,用于将流中的元素转换为 Map。让我们分解你的 Collectors.toMap() 例子并逐步解释它。

方法签名

Collectors.toMap() 有多种重载版本,最常见的有以下两种:

  1. Basic Version:

    toMap(Function keyMapper, Function valueMapper)
    
    • keyMapper:用于提取键的函数。
    • valueMapper:用于提取值的函数。
  2. Version with Merge Function:

    toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
    
    • keyMapper:用于提取键的函数。
    • valueMapper:用于提取值的函数。
    • mergeFunction:当多个元素产生相同的键时,用于解决冲突的合并函数。

例子中的用法

Collectors.toMap(x -> x.getBusId(), x -> x, (k1, k2) -> k1)
  1. x -> x.getBusId():
    这是 keyMapper 函数,它指定了如何从每个流元素 x 提取键。在这个例子中,假设 x 是某种对象,getBusId() 是该对象的一个方法,它返回一个值,该值将用作 Map 中的键。

  2. x -> x:
    这是 valueMapper 函数,它指定了如何从每个流元素 x 提取值。在这个例子中,它简单地返回流中的元素本身,表示将流中的对象作为 Map 的值。

  3. (k1, k2) -> k1:
    这是 mergeFunction 函数,当两个元素的键相同时,toMap 会调用该函数来决定保留哪一个值。在这个例子中,如果发生键冲突,它将保留第一个值 k1,并忽略第二个值 k2

详细解释

假设我们有一个类 Bus,并且我们有一个 List<Bus>,我们想将它转换为一个 Map,其中 busId 作为键,Bus 对象本身作为值。假设列表中可能存在多个具有相同 busIdBus 对象,我们可以使用这个 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

通过这种方式,你可以将流中的元素转换为键值对,处理可能的键冲突情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值