Дополнительный интерфейс Java: вложенные условия в цепочке необязательных объектов - PullRequest
0 голосов
/ 27 марта 2019

Я хотел бы написать еще раз этот код для полных 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)) {

Я не совсем понимаю, как это решить.

Есть идеи?

1 Ответ

1 голос
/ 27 марта 2019

Первое условие if (!reference.isPresent()) покрыто .orElse(Response.status(Status.NOT_FOUND))

Для покрытия второго условия if (Objects.isNull(responseBuilder)) создайте Optional из результата this.request.evaluatePreconditions(entityTag), а затем orElseGet для возврата ok builder

Приведенный ниже код написан с моей головы, я не проверял его

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...