首页 文章

可选和同时铸造

提问于
浏览
6

如果不是 null ,我有一个 BigDecimal 量我想要转换为 Long 但是我得到了 java.lang.NullPointerException 异常:

BigDecimal bgAmount = getAmount();

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

5 回答

  • 0

    如果 bgAmountnull ,则在其上调用 longValue 将导致 NullPointerException . 请注意,这与可选项无关,因为在您应用可选项之前调用它 .

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

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

    不要...使用 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

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

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

    你读变量 bgAmount 的次数唯一不同,这段代码读了一次,而不是上面的两次答案(这是非常重要的,如果有的话 - 但我养成了写这样的代码的习惯) .

  • 4

    首先,你错误地使用 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);
    
  • 1

    似乎 bgAmount 为null所以在调用 bgAmount.longValue() 时会出现异常 .

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

    顺便说一句,这里不使用 ofNullable ,因为 bgAmount.longValue() 永远不会为空 .

    你可能想做:

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

相关问题