Chain Optional.orElseThrow - PullRequest
       50

Chain Optional.orElseThrow

0 голосов
/ 26 февраля 2019

У меня есть фрагмент кода, подобный этому:

return getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));

В данный момент я выкидываю исключение, когда данный Object отсутствует.

Теперь мне нужнотакже проверьте, присутствует ли nullableField из Object.

Одним из очевидных решений может быть что-то вроде этого:

var fieldVal = getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));

  return Optional.ofNullable(fieldVal)
     .orElseThrow(() -> new IllegalStateException("Field is not present"));

Но я бы хотел реализовать это в том же функционалецепь ...

Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вместо того, чтобы вкладывать, я бы предложил простую последовательность, чтобы решить это как:

0 голосов
/ 27 февраля 2019

Я бы рекомендовал полностью отказаться от подхода Optional или, по крайней мере, использовать его только в начале (Представляя, что getObject() нельзя изменить):

var value = getObject()
    .orElseThrow(() -> new IllegalStateException("Object not found!"));

var field = value.getNullableField();
if(field == null) {
    throw new IllegalStateException("Field is not present");
}
return field;

Это не вводит новыйOptional Обертка, чтобы вы могли "свободно говорить" и делать все это в одной строке / выражении.

0 голосов
/ 26 февраля 2019

Это может быть реализовано в одной цепочке напрямую, вы получите другое исключение.Теперь, конечно, он менее читабелен, чем ваше первое решение, поэтому у вас есть компромисс.

return getObject().map(obj -> Optional.ofNullable(obj.getNullableField())
                                      .orElseThrow(() -> new IllegalStateException("Field is not present")))
                  .orElseThrow(() -> new IllegalStateException("Object not found!"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...