在构建器模式中可选,get()

Optional in builder pattern, get()

我正在 Java(使用 Spring)开发 Web 应用程序的后端,并尝试使用构建器模式。 我有 classes

现在我遇到一个函数返回一个 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()