如何在Lambda表达式中抽象方法调用以消除重复代码?
Java抽取Getter方法引用复用公共逻辑实现方案
核心思路是利用Java 8+的内置函数式接口封装Getter方法逻辑,抽取出公共处理流程,不同业务方法仅需传入对应方法引用即可复用代码,具体实现分两种场景适配:
场景1:getBlah接收String类型参数
如果你的getBlah方法定义为String getBlah(String name),实现如下:
1. 抽取公共私有方法
// 入参为原始Entity和DetailData的Getter方法对应的Function private String mapCommon(Entity entity, Function<DetailData, String> detailGetter) { return Optional.ofNullable(getSomething(entity)) .map(detailData -> getBlah(detailGetter.apply(detailData))) .orElse(null); }
2. 改造原有业务方法
protected String mapABC(Entity entity, @Context MappingContext mappingContext) { return mapCommon(entity, DetailData::getName); } protected String mapXYZ(Entity entity, @Context MappingContext mappingContext) { return mapCommon(entity, DetailData::getFirstname); }
场景2:getBlah接收Supplier<String>类型参数
如果你的getBlah方法定义为String getBlah(Supplier<String> nameSupplier)(和你示例中传入方法引用的写法一致),实现如下:
1. 抽取公共私有方法
// 入参为原始Entity和生成Getter方法引用的Function private String mapCommon(Entity entity, Function<DetailData, Supplier<String>> getterSupplier) { return Optional.ofNullable(getSomething(entity)) .map(detailData -> getBlah(getterSupplier.apply(detailData))) .orElse(null); }
2. 改造原有业务方法
protected String mapABC(Entity entity, @Context MappingContext mappingContext) { return mapCommon(entity, detailData -> detailData::getName); } protected String mapXYZ(Entity entity, @Context MappingContext mappingContext) { return mapCommon(entity, detailData -> detailData::getFirstname); }
注意事项
- Lombok生成的Getter方法名要和方法引用匹配,你的
DetailData类中字段为firstname,生成的Getter是getFirstname,不要写成getFirstName避免编译报错。 - 后续新增其他
DetailData字段的映射方法时,仅需新增对应业务方法,传入对应字段的方法引用即可,无需重复编写Optional处理逻辑。
内容的提问来源于stack exchange,提问作者DerBenniAusA
相关产品推荐
相关产品推荐

