如何比较布尔值?

2022-09-01 05:34:39

以这个为例(摘自Java正则表达式检查器不起作用):

while(!checker) {
    matcher = pattern.matcher(number);
    if(matcher.find())
        checker = true;
    else
        year++;
}

如果 用于检查 的值,是否重要?.equals(false)Boolean checker

我知道有这个非常相似。但是,显然这个问题处理的是基元而不是对象包装器, ;因此,将不适用。booleanBoolean.equals()

另外,应该以不同的方式处理?Booleanboolean


答案 1

试试这个:

if (Boolean.TRUE.equals(yourValue)) { ... }

作为额外的好处,这是空安全的。


答案 2

从您的评论中可以看出,您似乎正在寻找使用包装类的“最佳实践”。但实际上没有任何最佳实践,因为从一开始就使用这个类是一个坏主意。使用对象包装器的唯一原因是在你绝对必须的情况下(例如,当使用泛型时,即存储在 a 或类似的地方)。使用对象包装器没有优点,也有很多缺点,最值得注意的是,它打开了你的大门。BooleanbooleanHashMap<String, Boolean>NullPointerException

对于布尔值,是否使用“!”而不是 .equals() 是否重要?

这两种技术都容易受到 ,所以在这方面并不重要。在第一种情况下,将取消装箱到其各自的值中,并像往常一样进行比较。在第二种方案中,您将从该类中调用一个方法,如下所示:NullPointerExceptionBooleanbooleanBoolean

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

无论哪种方式,结果都是一样的。

如果使用 .equals(false) 来检查布尔检查器的值,这有关系吗?

根据上述内容,没有。

第二个问题:布尔值的处理方式是否应该与布尔值不同?

如果绝对必须使用该类,请在执行任何比较之前始终进行检查。例如,Booleannull

Map<String, Boolean> map = new HashMap<String, Boolean>();
//...stuff to populate the Map
Boolean value = map.get("someKey");
if(value != null && value) {
    //do stuff
}

这将起作用,因为Java会缩短条件评估。您还可以使用三元运算符。

boolean easyToUseValue = value != null ? value : false;

但说真的...只需使用基元类型,除非您被迫不这样做。