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

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java stream Collectors.toMap是一个流式处理方法,用于将一个List集合转换为Map集合。它接受三个参数:第一个参数指定了作为Map的key值的属性或方法引用,第二个参数指定了作为Map的value值的属性或方法引用,第三个参数用于处理key重复的情况。 通过使用Collectors.toMap方法,可以将一个List集合中的元素按照指定的属性或方法引用作为key值,将整个对象或属性值作为value值,构建出一个key值唯一的Map集合。 举例来说,如果有一个List<proVo>对象的集合,我们希望将其中的proVo对象按照id作为key,name作为value,构建成一个Map集合,可以使用如下代码: Map<Long, String> map = list.stream().collect(Collectors.toMap(proVo::getId, proVo::getName)); 这样就可以得到一个key为id,value为name的Map集合。 另外,如果在转换过程中遇到了key重复的情况,可以通过第三个参数来处理。比如可以选择保留前一个元素的值,或者保留后一个元素的值,或者进行其他自定义的处理。 例如: Map<Long, String> map = list.stream().collect(Collectors.toMap(proVo::getId, proVo::getName, (k1, k2) -> k1)); 这样当遇到key重复的情况时,会保留前一个元素的值作为value。 总之,java stream Collectors.toMap方法是用于将List集合转换为Map集合的一个便捷方法,可以根据需求选择合适的参数来进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java8stream源码-streams:用于针对旧设备的Android项目的java.util.stream库的非常不完整的重新实现](https://download.csdn.net/download/weixin_38690522/19389466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【业务功能篇35】Java Stream流 :Collectors.toMap](https://blog.csdn.net/studyday1/article/details/131454535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值