具有一个操作数 null 的 BigDecimal min() 方法
BigDecimal min() method with one operand null
我有这个比较:
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))
最初我尝试设置任何最终为 null 的值和任意上限值,但我不允许这样做。这意味着我需要摆脱这个单行比较解决方案以获得冗长的 if-else-if,我真的不想这样做。
有没有一种优雅的方法来处理空案例场景。任何建议将不胜感激。
谢谢。
假设我理解你的问题,这似乎是你可以使用三元的地方。喜欢,
BigDecimal minLimit = firstLimit != null ?
firstLimit.min(secondLimit.min(thirdLimit)) :
secondLimit.min(thirdLimit);
或者,一个默认的初始值和一个 if
应该就足够了(比较顺序与找到最小值无关)。喜欢,
BigDecimal minLimit = secondLimit.min(thirdLimit);
if (firstLimit != null) {
minLimit = minLimit.min(firstLimit);
}
您还可以使用 Optional 从 java 8
BigDecimal minLimit = Optional.ofNullable(firstLimit)
.map(fl->fl.min(secondLimit.min(thirLimit)))
.orElse(secondLimit.min(thirLimit));
我想你可以这样使用 Stream.of
:
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(BigDecimal::compareTo)
.orElse(null); // Or return a default value
或者如果所有输入都为空,您可以抛出异常:
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(BigDecimal::compareTo)
.orElseThrow(() -> new IllegalArgumentException("All values are null"));
或者正如 Holger 在评论中提到的那样,您可以使用 .min(Comparator.naturalOrder())
而不是 .min(BigDecimal::compareTo)
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(Comparator.naturalOrder())
.orElseThrow(() -> new IllegalArgumentException("All values are null"));
我有这个比较:
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))
最初我尝试设置任何最终为 null 的值和任意上限值,但我不允许这样做。这意味着我需要摆脱这个单行比较解决方案以获得冗长的 if-else-if,我真的不想这样做。 有没有一种优雅的方法来处理空案例场景。任何建议将不胜感激。 谢谢。
假设我理解你的问题,这似乎是你可以使用三元的地方。喜欢,
BigDecimal minLimit = firstLimit != null ?
firstLimit.min(secondLimit.min(thirdLimit)) :
secondLimit.min(thirdLimit);
或者,一个默认的初始值和一个 if
应该就足够了(比较顺序与找到最小值无关)。喜欢,
BigDecimal minLimit = secondLimit.min(thirdLimit);
if (firstLimit != null) {
minLimit = minLimit.min(firstLimit);
}
您还可以使用 Optional 从 java 8
BigDecimal minLimit = Optional.ofNullable(firstLimit)
.map(fl->fl.min(secondLimit.min(thirLimit)))
.orElse(secondLimit.min(thirLimit));
我想你可以这样使用 Stream.of
:
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(BigDecimal::compareTo)
.orElse(null); // Or return a default value
或者如果所有输入都为空,您可以抛出异常:
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(BigDecimal::compareTo)
.orElseThrow(() -> new IllegalArgumentException("All values are null"));
或者正如 Holger 在评论中提到的那样,您可以使用 .min(Comparator.naturalOrder())
.min(BigDecimal::compareTo)
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
.filter(Objects::nonNull)
.min(Comparator.naturalOrder())
.orElseThrow(() -> new IllegalArgumentException("All values are null"));