比较字符串是否为空时返回布尔值

4

我正在尝试将以下代码迁移到Java 8

 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

5
为什么不能使用普通的Java呢?我的意思是在这里转换为Stream并没有给你带来任何积极的东西。看起来一样,甚至更加繁琐。我建议最好使用Guava中的Strings.isNullOrEmpty()。 - vmrvictor
8
return id2 == null || id2.isEmpty() || id2.equals(id1); 是简洁、高效且有效的 Java 8 语法。 - Holger
2
@Holger 当我看到所有这些“试图将以下代码迁移到Java 8”时,我也是这么想的... 哎呀,真的吗... - Ousmane D.
3个回答

3

可选项并不是用来取代简单的if检查的。它实质上是在"迁移"至一种不够易读和高效的解决方案。

如果我是你,我会坚持当前的解决方案,因为它是更好的选择,但如果你想要进行一些代码高尔夫,则可以像@Holger在评论中展示的那样操作:

return id2 == null || id2.isEmpty() || id2.equals(id1);

2
map函数传递的FunctionOptional不为空时被执行(即当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。 在Optional版本中,您不会得到此异常。

应该是 .orElse(false),请勿误解。 - coder25
orElse 在 id2 == null 时被执行,而你希望在这种情况下返回 true。@coder25 - Eran
点赞最后的编辑,评论使其更有意义和易于理解。 - Naman
2
@Eugene 你的意思是,你在想哪个更不难读? - Holger
2
@Eugene,正如Holger所指出的那样,易于理解是我所说的意思,因为上面代码的可读性与您的解决方案一样复杂。并不是说它们是错误的,只是在Eran发表评论之前,我发现很难将相同的逻辑与问题联系起来。 - Naman
显示剩余2条评论

0
这样怎么样:
private static boolean test(String left, String right) {
    return Optional.ofNullable(right)
            .map(String::isEmpty)
            .orElse(true)
            || left.equals(right);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接