可选并同时投放

时间:2018-12-09 17:30:19

标签: java java-8 optional bigdecimal

如果不是BigDecimal,我有一个Long金额要转换为null,但是我却有一个java.lang.NullPointerException例外:

BigDecimal bgAmount = getAmount();

long totalSupplyFilterMin = 
              Optional.ofNullable(bgAmount.longValue()).orElse(Long.MIN_VALUE);

5 个答案:

答案 0 :(得分:7)

请勿使用Optional进行空检查。只需明确检查null,然后然后取消引用该对象(如果它不为null)。

BigDecimal bgAmount = getAmount();
long totalSupplyFilterMin = Long.MIN_VALUE;
if(bgAmount != null) {
    totalSupplyFilterMin = bgAmount.longValue();
}

You use Optional as a return value to indicate the absence of a value.不是代替空检查。

答案 1 :(得分:5)

首先,您错误地使用了Optional。当bgAmount == null时,Optional.ofNullable(bgAmount.longValue())抛出NPE。正确的用法是:

Optional.ofNullable(bgAmount)
        .orElse(BigDecimal.valueOf(Long.MIN_VALUE))
        .longValue();

Optional.ofNullable(bgAmount)
                   .map(BigDecimal::longValue)
                   .orElse(Long.MIN_VALUE);

答案 2 :(得分:1)

似乎bgAmount为空,因此在调用bgAmount.longValue()时会出现异常。

long totalSupplyFilterMin = Optional.ofNullable(bgAmount.longValue())
                                    .orElse(Long.MIN_VALUE);

请不要在此处使用ofNullable,因为bgAmount.longValue()永远不会为null。

您可能想做:

Optional.ofNullable(bgAmount).map(s -> s.longValue()).orElse(Long.MIN_VALUE);

答案 3 :(得分:1)

通常,我们的代码库中有一个模式,类似于下面的代码,但在这种情况下,与Makoto's answer并没有太大区别:

long totalSupplyFilterMin = Long.MIN_VALUE;
BigDecimal bgAmount;
if ((bgAmount = getAmount()) != null) {
     totalSupplyFilterMin = bgAmount.longValue();
}

您读取 变量bgAmount的唯一次数不同,此代码读取一次,而不是上面的答案两次(这非常罕见,即使有-但我已经养成了编写此类代码的习惯)。

答案 4 :(得分:0)

如果bgAmountnull,则在其上调用longValue将得到NullPointerException。请注意,这与可选项无关,因为在您应用可选项之前就已经调用了它。

相反,您可以致电map来安全地应用此转换:

long totalSupplyFilterMin = 
     Optional.ofNullable(bgAmount).map(BigDecimal::longValue).orElse(Long.MIN_VALUE);