You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让getMemberMap方法接收Generic Function<T,R>作为键映射器参数

改造getMemberMap方法以支持动态键映射

需求背景

原有getMemberMap方法固定以Member的name字段作为键生成Map,需要改造为可接收任意键映射器参数,支持根据id、code等不同字段生成对应Map。

修改后的方法实现

import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public <K> Map<K, Member> getMemberMap(Function<Member, K> keyMapper) {
    return Collections.unmodifiableMap(
        getMemberList().stream()
            .collect(Collectors.toMap(keyMapper, Function.identity()))
    );
}

关键说明

  • 泛型声明:通过泛型支持任意类型的键(比如String类型的name/code、Long类型的id等),提升方法的通用性
  • 键映射器参数:Function<Member, K> keyMapper参数负责从Member对象中提取键值,调用时可直接传入方法引用(如Member::getId)或自定义lambda表达式
  • 保持不可变Map:继续使用Collections.unmodifiableMap包裹结果,避免外部代码修改内部数据,保证数据安全性

可选:处理重复键场景

如果getMemberList()中存在键重复的Member对象,默认的Collectors.toMap会抛出IllegalStateException。可以重载方法增加合并逻辑:

import java.util.function.BinaryOperator;

public <K> Map<K, Member> getMemberMap(Function<Member, K> keyMapper, BinaryOperator<Member> mergeFunction) {
    return Collections.unmodifiableMap(
        getMemberList().stream()
            .collect(Collectors.toMap(keyMapper, Function.identity(), mergeFunction))
    );
}

使用示例(遇到重复键时保留后出现的对象):

getMemberMap(Member::getId, (existing, replacement) -> replacement);

使用示例

  • 按name字段生成Map:getMemberMap(Member::getName)
  • 按id字段生成Map:getMemberMap(Member::getId)
  • 按code字段生成Map:getMemberMap(Member::getCode)

内容的提问来源于stack exchange,提问作者Paschan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:04