我想使用Java8简化下面的代码,使用多个if和else语句。有什么方法可以使用一些Java8特性(例如Optional )来完全消除它们吗?我试图在这里找到一些东西,但却找不到答案。
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;
}发布于 2020-03-19 02:47:36
这里的逻辑很难理解。相反,要更直接地表达你的意图:
private static final Comparator<ChronoLocalDateTime<?>> EARLIEST_PRESENT =
Comparator.nullsLast(Comparator.naturalOrder());
LocalDateTime eDate = BinaryOperator.minBy(EARLIEST_PRESENT).apply(beDate, aeDate);(请注意,来自Comparator和BinaryOperator的元素的静态导入将使这一点更加清晰。)
发布于 2020-03-19 08:09:54
您的条件是多余的,因为结果只是两个可能的结果之一:
if (beDate == null && aeDate == null) {
eDate = null;
}
else if (beDate != null && aeDate == null) {
eDate = beDate;
}
...在这两种情况下,eDate都将具有与beDate相同的内容,无论null与否。所以if(aeDate == null) eDate = beDate;就足够了。在所有其他情况下,您都要分配aeDate,但只有一个例外:
...
else if (beDate != null && aeDate != null &&
(beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
eDate = beDate;
}
...我们可以将beDate.isEqual(aeDate) || beDate.isBefore(aeDate)简化为aeDate.isAfter(beDate)。
因此,整个语句可以写成:
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的值。
操作符优先级使得括号没有必要,但为了清晰起见,保留方括号也是有效的。
发布于 2020-03-19 02:31:48
您可以使用Optional.ofNullable,但我不建议这样做。
用Optional包装所有东西不会使它更容易阅读。您必须进行null检查,所以您要用obj.isEmpty() (或java 8中的obj.isEmpty() )替换obj == null。
https://stackoverflow.com/questions/60750119
复制相似问题