Java如何传递函数引用至方法并使用?实现方法泛化
用Lambda/函数引用实现泛化的关联处理方法
先脑补下你原来的p1方法逻辑——应该是遍历每个C实例,通过getIds()拿到关联ID,再从bs里取出对应B,最后调用addB()把B加到C里对吧?要把这个逻辑泛化,核心就是把**“获取关联ID集合”、“根据ID取关联对象”、“将关联对象添加到目标实例”**这三个步骤抽成参数,用函数式接口传递就行。
泛化后的方法实现
我们可以用Java内置的Function、BiConsumer这些函数式接口来定义参数,写出通用的处理逻辑:
import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Function; private <T, U, ID> void processAssociations( Map<ID, T> targetMap, Map<ID, U> sourceMap, Function<T, Set<ID>> getIdExtractor, BiConsumer<T, U> associator) { for (T target : targetMap.values()) { Set<ID> ids = getIdExtractor.apply(target); for (ID id : ids) { U source = sourceMap.get(id); if (source != null) { associator.accept(target, source); } } } }
对应原逻辑的调用方式
直接传方法引用或者Lambda就能复用原p1的逻辑,两种写法都可以:
// 写法1:用方法引用(简洁直观,推荐) private void p1(Map<Integer, C> cs, Map<Integer, B> bs) { processAssociations( cs, bs, C::getIds, // 从C中提取ID集合的方法引用 C::addB // 把B添加到C的方法引用 ); } // 写法2:用Lambda(适合需要额外处理逻辑的场景) private void p1WithLambda(Map<Integer, C> cs, Map<Integer, B> bs) { processAssociations( cs, bs, c -> c.getIds(), (c, b) -> c.addB(b) ); }
泛化的优势
- 灵活性拉满:以后遇到类似的关联场景,比如类
D有getUserIds()和addUser(User u),直接传对应的方法引用就能复用这个通用方法,不用重复写遍历逻辑。 - 可读性更强:参数名
getIdExtractor、associator直接点明每个步骤的作用,比嵌套循环更清晰。 - 扩展性方便:如果需要加过滤ID、自定义空值处理的逻辑,只需再加个
Predicate类型的参数就行。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

