在访问值之前,请调用“ Optional#isPresent()

时间:2019-03-28 21:25:41

标签: java java-stream

访问值之前,我无法解决错误呼叫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 个答案:

答案 0 :(得分:1)

您可以使用Optional.map()Optional.orElse()Optional.orElseThrow()

findstring /v File.txt > small_file.txt

这将映射结果值(如果存在)。如果不是,则返回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()) {
    // ...
}

答案 1 :(得分:1)

一个Optional可以包含一个值或一个null。如果您在空的Optional(值为null的可选)上调用.get(),则会收到异常。

防止这种情况发生的一种方法是先调用.isPresent()-如果没有值,则跳过对.get()的调用。

另一种方法是使用@SamuelPhilipp描述的.map().orElse()方法。

答案 2 :(得分:-1)

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