首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个操作数为空的BigDecimal min()方法

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

Stack Overflow用户
提问于 2020-06-28 15:19:38
回答 3查看 680关注 0票数 3

我有这样的比较:

代码语言:javascript
复制
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))

最初,我试图设置任何最终为空值的任意上限值,但我不允许这样做。这意味着,我需要摆脱这一行比较解决方案的冗长的if-否则-如果,我真的不喜欢。是否有一种优雅的方法来处理空案例场景。如有任何建议,将不胜感激。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-28 15:30:38

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

代码语言:javascript
复制
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(BigDecimal::compareTo)
        .orElse(null); // Or return a default value

如果所有输入都为null,则可以抛出异常:

代码语言:javascript
复制
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(BigDecimal::compareTo)
        .orElseThrow(() -> new IllegalArgumentException("All values are null"));

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

代码语言:javascript
复制
BigDecimal minLimit = Stream.of(firstLimit, secondLimit, thirdLimit)
        .filter(Objects::nonNull)
        .min(Comparator.naturalOrder())
        .orElseThrow(() -> new IllegalArgumentException("All values are null"));
票数 7
EN

Stack Overflow用户

发布于 2020-06-28 15:24:45

假设我理解你的问题,这似乎是一个你可以用三元的地方。喜欢,

代码语言:javascript
复制
BigDecimal minLimit = firstLimit != null ?
        firstLimit.min(secondLimit.min(thirdLimit)) :
        secondLimit.min(thirdLimit);

或者,一个缺省的初始值和一个if就足够了(比较的顺序对于找到最小值并不重要)。喜欢,

代码语言:javascript
复制
BigDecimal minLimit = secondLimit.min(thirdLimit);
if (firstLimit != null) {
    minLimit = minLimit.min(firstLimit);
}
票数 1
EN

Stack Overflow用户

发布于 2020-06-28 15:27:23

还可以使用java 8中的可选

代码语言:javascript
复制
BigDecimal minLimit = Optional.ofNullable(firstLimit)
                              .map(fl->fl.min(secondLimit.min(thirLimit)))
                              .orElse(secondLimit.min(thirLimit));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62624498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档