Java 将字符串比较为null或空时返回布尔值
我正在尝试将下面的代码迁移到Java8Java 将字符串比较为null或空时返回布尔值,java,java-8,optional,Java,Java 8,Optional,我正在尝试将下面的代码迁移到Java8 private boolean test(String id1, String id2) { if(id2== null || id2.isEmpty()) return true; return id1.equals(id2); } 尝试的解决方案 Optional.ofNullable(id2).map(String::isEmpty).orElse(id2.equals(id1)); 上述解决方案在以下
private boolean test(String id1, String id2) {
if(id2== null || id2.isEmpty()) return true;
return id1.equals(id2);
}
尝试的解决方案
Optional.ofNullable(id2).map(String::isEmpty).orElse(id2.equals(id1));
上述解决方案在以下情况下不起作用:
id2 is null
id2 is equal to id1
当
可选
不为空时(即id2!=null
),将对传递给映射的函数
进行评估
因此,它应该是:
private static boolean test(String id1, String id2) {
return Optional.ofNullable(id2)
.map(id -> id.isEmpty() || id.equals(id1)) // return true if id2
// is empty or equal
// to id1
.orElse(true); // return true when id2 == null
}
请注意,与原始代码相比,行为略有变化。在原始代码中,如果id1==null
(除非将id1.equals(id2)
更改为id2.equals(id1)
),您将得到一个NullPointerException
)。在可选版本中,您将不会使用。如何改为:
private static boolean test(String left, String right) {
return Optional.ofNullable(right)
.map(String::isEmpty)
.orElse(true)
|| left.equals(right);
}
如果
检查,则可选的并不意味着替换简单的。实际上,您正在“迁移”到可读性较差、效率较低的解决方案
如果我是你,我会坚持使用你当前的解决方案,因为这是更好的选择,但是如果你想对高尔夫进行一点编码,那么你可以按照@Holger在评论中所示的那样做:
return id2 == null || id2.isEmpty() || id2.equals(id1);
如果不是,则在id2==null时执行.orElse(false)orElse,在这种情况下,您希望返回true@coder25upvote为最后一次编辑投票,这些评论使它更有意义,更容易理解understand@Eugene你的意思是,你想知道哪一个不太容易理解?@Eugene正如霍尔格所指出的,我所说的容易理解,因为上述代码的可读性和你的解决方案一样复杂。并不是说它们是不正确的,只是在Eran发表这些评论之前,我发现很难将相同的逻辑与问题联系起来。为什么不能使用普通java,我的意思是,在这里转换为流并没有给你带来任何积极的东西—它看起来是一样的,甚至更麻烦。我倾向于使用guavareturn id2==null | | | id2.isEmpty()| | id2.equals(id1)
是简洁、高效和有效的Java 8语法。@Holger正是我看到所有这些“试图将下面的代码迁移到Java 8”时所想的。。。嗯,说真的。。。