一个操作数为空的 BigDecimal min() 方法

2 java bigdecimal java-8

我有这个比较:

BigDecimal firstLimit = null; <<-------------------------sometimes firstLimit could be null
BigDecimal secondLimit = BigDecimal.valueof(10); <<--- sometimes secondLimit can be null
BigDecimal thirdLimit = BigDecimal.valueof(20);  <<--- sometimes thirdLimit can be null
BigDecimal minLimit = firstLimit.min(secondLimit.min(thirLimit))
Run Code Online (Sandbox Code Playgroud)

最初,我尝试设置任何最终为空的值,并使用任意上限值,但我不允许这样做。这意味着我需要为冗长的 if-else-if 去掉这个单行比较解决方案,我真的不想这样做。是否有一种优雅的方法来处理空情况。任何建议将不胜感激。谢谢你。

YCF*_*F_L 6

我认为你可以这样使用Stream.of

BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(BigDecimal::compareTo)
        .orElse(null); // Or return a default value
Run Code Online (Sandbox Code Playgroud)

或者,如果所有输入都为空,您可以抛出异常:

BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(BigDecimal::compareTo)
        .orElseThrow(() -> new IllegalArgumentException("All values are null"));
Run Code Online (Sandbox Code Playgroud)

或者正如霍尔格在评论中提到的那样,.min(BigDecimal::compareTo)你可以使用.min(Comparator.naturalOrder())

BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(Comparator.naturalOrder())
        .orElseThrow(() -> new IllegalArgumentException("All values are null"));
Run Code Online (Sandbox Code Playgroud)

  • `Comparator.naturalOrder()` 返回一个共享单例,可重用于所有实现 `Comparable` 的类,而 `BigDecimal::compareTo` 请求一个 `Comparator` 实现,调用 `BigDecimal` 的 `compareTo`,在当前实现中创建一个不同的班级。 (5认同)
  • 除了“BigDecimal::compareTo”之外,您还可以使用“Comparator.naturalOrder()” (3认同)