首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中使用可选的多个空检查

问在Java 8中使用可选的多个空检查
EN

Stack Overflow用户
提问于 2020-03-19 02:28:46
回答 4查看 467关注 0票数 2

我想使用Java8简化下面的代码,使用多个if和else语句。有什么方法可以使用一些Java8特性(例如Optional )来完全消除它们吗?我试图在这里找到一些东西,但却找不到答案。

代码语言:javascript
复制
LocalDateTime beDate = someDate;
LocalDateTime aeDate = someDate;
LocalDateTime eDate;

if (beDate == null && aeDate == null) {
    eDate = null;
}
else if (beDate != null && aeDate == null) {
    eDate = beDate;
}
else if (beDate == null && aeDate != null) {
    eDate =  aeDate;
}
else if (beDate != null && aeDate != null && 
        (beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
    eDate = beDate;
}
else {
    eDate = aeDate;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-19 02:47:36

这里的逻辑很难理解。相反,要更直接地表达你的意图:

代码语言:javascript
复制
private static final Comparator<ChronoLocalDateTime<?>> EARLIEST_PRESENT = 
    Comparator.nullsLast(Comparator.naturalOrder());

LocalDateTime eDate = BinaryOperator.minBy(EARLIEST_PRESENT).apply(beDate, aeDate);

(请注意,来自Comparator和BinaryOperator的元素的静态导入将使这一点更加清晰。)

票数 10
EN

Stack Overflow用户

发布于 2020-03-19 08:09:54

您的条件是多余的,因为结果只是两个可能的结果之一:

代码语言:javascript
复制
if (beDate == null && aeDate == null) {
    eDate = null;
}
else if (beDate != null && aeDate == null) {
    eDate = beDate;
}
...

在这两种情况下,eDate都将具有与beDate相同的内容,无论null与否。所以if(aeDate == null) eDate = beDate;就足够了。在所有其他情况下,您都要分配aeDate,但只有一个例外:

代码语言:javascript
复制
...
else if (beDate != null && aeDate != null && 
        (beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
    eDate = beDate;
}
...

我们可以将beDate.isEqual(aeDate) || beDate.isBefore(aeDate)简化为aeDate.isAfter(beDate)。

因此,整个语句可以写成:

代码语言:javascript
复制
LocalDateTime eDate
    = aeDate == null || (beDate != null && aeDate.isAfter(beDate))? beDate: aeDate;

||是短路的,这意味着,只有当左手侧计算为false时,才计算右手侧,所以当左手侧是aeDate == null时,就意味着右手侧的aeDate != null是不需要重复的。

因此,如果eDate是null (前两个if语句),或者两者都不是null,而aeDate在beDate之后(另一个被引用的if语句),那么aeDate的值将是null,否则将得到aeDate的值。

操作符优先级使得括号没有必要,但为了清晰起见,保留方括号也是有效的。

票数 7
EN

Stack Overflow用户

发布于 2020-03-19 02:31:48

您可以使用Optional.ofNullable,但我不建议这样做。

用Optional包装所有东西不会使它更容易阅读。您必须进行null检查,所以您要用obj.isEmpty() (或java 8中的obj.isEmpty() )替换obj == null。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60750119

复制
相关文章

相似问题

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