在构建器模式中可选,get()
Optional in builder pattern, get()
我正在 Java(使用 Spring)开发 Web 应用程序的后端,并尝试使用构建器模式。
我有 classes
- 示例(作为数据对象)
- ExampleDocument(作为另一个数据对象)
- 示例映射器
- ExampleRepository(扩展 MongoRepository)
- 示例控制器(REST)
- 示例服务
现在我遇到一个函数返回一个 Optional (findById, Mongo-Repo) 到我的服务的问题:
@Service
@RequiredArgsConstructor
public class ExampleService {
private final ExampleMapper exampleMapper;
private final ExampleRepository exampleRepository;
public Example getExample(String exampleId) {
Optional<ExampleDocument> document = exampleRepository.findById(exampleId);
return exampleMapper.mapToDto(document);
}
我想在我的映射器 class 中映射文档,因为我习惯于对其他文档进行映射(没有 Optional 看起来像这样,我从另一个 class 中举了一个例子:
@Component
public class OtherExampleMapper {
public OtherExample mapToDto(OtherExampleDocument document) {
return OtherExample.builder()
.id(document.getId())
.existingSolutions(document.getExistingSolutions())
...
.build();
}
)
我尝试使用 ifPresent,但 builderPattern 似乎无法识别该表达式,因为我在“getId()”上有一个黄色标记,告诉我“'PitchEventDocument.getId()' 的结果被忽略”和一个红色标记标记“.build()”
@Component
public class PitchEventMapper {
public Example mapToDto(Optional<ExampleDocument> document) {
return Example.builder()
.id(document.ifPresent(id -> document.get().getId())
.build();
}
如何结合可选的构建器模式?
您的基本问题是 ifPresent
根本不是 return 值——它是 void
。相反,你想要 orElse
(因为我认为你想要 null
或在这种情况下的另一个默认值),你不应该使用 get
——所有相关的“if”和“or” " 方法已经为您解包了值。
改为:
Example.builder()
.id(document.map(Document::getId).orElse(null))
.build()
我正在 Java(使用 Spring)开发 Web 应用程序的后端,并尝试使用构建器模式。 我有 classes
- 示例(作为数据对象)
- ExampleDocument(作为另一个数据对象)
- 示例映射器
- ExampleRepository(扩展 MongoRepository)
- 示例控制器(REST)
- 示例服务
现在我遇到一个函数返回一个 Optional (findById, Mongo-Repo) 到我的服务的问题:
@Service
@RequiredArgsConstructor
public class ExampleService {
private final ExampleMapper exampleMapper;
private final ExampleRepository exampleRepository;
public Example getExample(String exampleId) {
Optional<ExampleDocument> document = exampleRepository.findById(exampleId);
return exampleMapper.mapToDto(document);
}
我想在我的映射器 class 中映射文档,因为我习惯于对其他文档进行映射(没有 Optional 看起来像这样,我从另一个 class 中举了一个例子:
@Component
public class OtherExampleMapper {
public OtherExample mapToDto(OtherExampleDocument document) {
return OtherExample.builder()
.id(document.getId())
.existingSolutions(document.getExistingSolutions())
...
.build();
}
)
我尝试使用 ifPresent,但 builderPattern 似乎无法识别该表达式,因为我在“getId()”上有一个黄色标记,告诉我“'PitchEventDocument.getId()' 的结果被忽略”和一个红色标记标记“.build()”
@Component
public class PitchEventMapper {
public Example mapToDto(Optional<ExampleDocument> document) {
return Example.builder()
.id(document.ifPresent(id -> document.get().getId())
.build();
}
如何结合可选的构建器模式?
您的基本问题是 ifPresent
根本不是 return 值——它是 void
。相反,你想要 orElse
(因为我认为你想要 null
或在这种情况下的另一个默认值),你不应该使用 get
——所有相关的“if”和“or” " 方法已经为您解包了值。
改为:
Example.builder()
.id(document.map(Document::getId).orElse(null))
.build()