Java可选接口:可选对象链上的嵌套条件

问题描述 投票:0回答:1

我想再次写这个代码一个完整的Optional流畅的方法来做到这一点:

Optional<Reference> reference = this.referenceService.get(id);
if (!reference.isPresent()) {
    return Response.status(Status.NOT_FOUND).build();
}

EntityTag entityTag = this.eTag(reference.get());
ResponseBuilder responseBuilder = this.request.evaluatePreconditions(entityTag);

if (Objects.isNull(responseBuilder)) {
    responseBuilder = Response
        .ok()
        .entity(reference.get())
        .cacheControl(this.cacheControl)
        .tag(entityTag);
}

return responseBuilder.build();

到目前为止,我已经能够做到这一点:

return this.referenceService.get(id)
    .map(this::eTag)
    .map(this.request::evaluatePreconditions)
    .orElse(Response.status(Status.NOT_FOUND))
    .cacheControl(this.cacheControl)
    .tag(this.eTag(this.referenceService.get(id).get()))
    .build();

但是这个代码和前一个代码不一样。

我有两个条件需要处理:

if (!reference.isPresent()) {
    return Response.status(Status.NOT_FOUND).build();
}

if (Objects.isNull(responseBuilder)) {

我不太明白如何解决这个问题。

有任何想法吗?

java optional
1个回答
1
投票

第一个条件if (!reference.isPresent()).orElse(Response.status(Status.NOT_FOUND))覆盖

为了覆盖第二个条件,if (Objects.isNull(responseBuilder))this.request.evaluatePreconditions(entityTag)的结果中选择一个可选项,然后使用orElseGet返回ok构建器

下面的代码是从我的头顶写的,我没有测试它

this.referenceService
    .get(id)
    .map(this::eTag)
    .map(entityTag -> Optional.ofNullable(this.request.evaluatePreconditions(entityTag))
                                .orElseGet(() -> Response.ok()
                                                        .entity(entityTag)
                                                        .cacheControl(this.cacheControl)
                                                        .tag(entityTag)))
    .orElse(Response.status(Status.NOT_FOUND))
    .buld();

为了简化表达式,可以在方法中重构Optional.ofNullable(...).orElseGet(...)部分并调用该方法而不是全部内联

像下面的东西

private ResponseBuilder getBuilderOrDefault(EntityTag entityTag) {
    return Optional.ofNullable(this.request.evaluatePreconditions(entityTag))
                   .orElseGet(() -> Response.ok()
                                            .entity(entityTag)
                                            .cacheControl(this.cacheControl)
                                            .tag(entityTag));
}

映射将成为

this.referenceService
    .get(id)
    .map(this::eTag)
    .map(this::getBuilderOrDefault)
    .orElse(Response.status(Status.NOT_FOUND))
    .buld();
© www.soinside.com 2019 - 2024. All rights reserved.