java - 如何在lamba表达式中抽象方法调用?
问题描述
给定以下两种方法(不是可编译的代码,只是结构):
protected String mapABC(
Entity entity, @Context MappingContext mappingContext) {
return Optional.ofNullable(getSomething(entity))
.map(
x -> getBlah(x::getName))
.orElse(null);
}
protected String mapXYZ(
Entity entity, @Context MappingContext mappingContext) {
return Optional.ofNullable(getSomething(entity))
.map(
x -> getBlah(x::getFirstName))
.orElse(null);
}
我正在考虑避免重复逻辑时的外观,以便可以编写类似以下结构的内容:
protected String mapXYZ(
Entity entity, @Context MappingContext mappingContext) {
return xxx(getName());
}
protected String mapXYZ(
Entity entity, @Context MappingContext mappingContext) {
return xxx(getFirsName());
}
private String xxx(Methodreference m){
return Optional.ofNullable(getSomething(entity))
.map(
x -> getBlah(x::m))
.orElse(null);
}
x 的类型是:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder(toBuilder = true)
public class DetailData {
private String name;
private String firstname;
}
我可以尝试任何想法吗?
解决方案
你应该采取Function<DetailData, String>
private String map(Function<DetailData, String> m){
return Optional.ofNullable(getSomething(entity))
.map(
x -> getBlah(m.apply(x)))
.orElse(null);
}
用法:
protected String mapXYZ(
Entity entity, @Context MappingContext mappingContext) {
return map(DetailData::getName);
}
protected String mapXYZ(
Entity entity, @Context MappingContext mappingContext) {
return map(DetailData::getFirstName);
}
推荐阅读
- javascript - 比较 Dates Pipe Angular 6 - 如何从 Observable 获取数据?
- php - 分页不适用于循环
- vba - 如果满足 IF 条件,则执行 Vlookup
- qt - Qt Installer Framework 控制器功能未被调用
- gradle - 使用设置调用 gradle 脚本 build.gradle 是否应该构建调试/发布风格并编写通用任务?
- clips - CLIPS:不是围绕类实例匹配的条件元素
- android - html在android中转换为粗体或斜体跨越字符串
- node.js - SDL2 音频选择输出“通道”
- excel - Excel VBA转PPT,代码随机复制同一张图表
- c# - 生成唯一的排列列表,不包括元素的排序