Вызовите "Необязательно # isPresent () перед доступом к значению - PullRequest
0 голосов
/ 29 марта 2019

Я не могу устранить ошибку. Вызовите Optional#isPresent(), прежде чем получите доступ к значению.

Попробовал так:

Optional <Long> maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(subAccountEntityComparator).get().getSubAccountId();

Comparator<SubAccount> subAccountEntityComparator = Comparator
        .comparing(SubAccount::getSubAccountId);
Long maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(subAccountEntityComparator).get().getSubAccountId();

Ответы [ 3 ]

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

Необязательный может содержать либо значение, либо ноль. Если вы вызовете .get() для пустой Необязательный (тот, который имеет значение NULL), вы получите исключение.

Один из способов защиты от этого - сначала вызвать .isPresent(), а затем пропустить вызов до .get(), если значение отсутствует.

Другой способ - использовать методы .map() и .orElse(), как описано в @ SamuelPhilipp.

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

Вы можете использовать Optional.map() и Optional.orElse() или Optional.orElseThrow():

Long maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(Comparator.comparing(SubAccount::getSubAccountId))
        .map(SubAccount::getSubAccountId)
        .orElse(0);

Отображает значение результата, если оно присутствует. Если нет, он возвращает значение orElse() или выдает исключение, если вы используете orElseThrow().

Вот пример orElseThrow():

Long maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(Comparator.comparing(SubAccount::getSubAccountId))
        .map(SubAccount::getSubAccountId)
        .orElseThrow(RuntimeException::new);

Это может быть полезно, если это ошибка, если результат не найден.

Если вы хотите выполнить что-то только при наличии значения, вы можете использовать это:

Optional<Long> maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(Comparator.comparing(SubAccount::getSubAccountId))
        .map(SubAccount::getSubAccountId);

if (maxId.isPresent()) {
    // ...
}

Или более короткий вариант:

trdObj.getAccount().getSubAccounts.stream()
        .max(Comparator.comparing(SubAccount::getSubAccountId))
        .map(SubAccount::getSubAccountId)
        .ifPresent(maxId -> {
            // ...
        });
0 голосов
/ 29 марта 2019
Optional <Long> maxId = trdObj.getAccount().getSubAccounts.stream()
        .max(subAccountEntityComparator).map(SubAccount::getSubAccountId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...