如何让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
相关产品推荐
相关产品推荐

