Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串比较为null或空时返回布尔值_Java_Java 8_Optional - Fatal编程技术网

Java 将字符串比较为null或空时返回布尔值

Java 将字符串比较为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)); 上述解决方案在以下

我正在尝试将下面的代码迁移到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));
上述解决方案在以下情况下不起作用:

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,我的意思是,在这里转换为流并没有给你带来任何积极的东西—它看起来是一样的,甚至更麻烦。我倾向于使用guava
return id2==null | | | id2.isEmpty()| | id2.equals(id1)
是简洁、高效和有效的Java 8语法。@Holger正是我看到所有这些“试图将下面的代码迁移到Java 8”时所想的。。。嗯,说真的。。。