我想再次写这个代码一个完整的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)) {
我不太明白如何解决这个问题。
有任何想法吗?
第一个条件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();