如何在Java中将字符串转换为布尔值,但要将null视为false?

9

我想知道在Java中是否有一种简单的方法(一行代码,无需创建函数)将String转换为Boolean,但是如果Stringnull,则Booleannull

如果我理解正确,Boolean类中的所有方法都会在输入字符串为null时返回false。为什么会这样呢?

为什么Boolean.valueOf(String s)snull的情况下返回false比返回null更好呢?


4
如果您的值已经包装在Optional中,那么Optional.ofNullable(s).map(Boolean::valueOf).orElse(null)是一种替代方法。这对于处理Optional对象特别有用。 - Adrian Leonhard
3个回答

7
为什么在snull的情况下,Boolean.valueOf(String s)返回false比返回null更好?
这是由于Java中的内置特性——自动装箱(autoboxing)。假设Boolean.valueOf(String s)实际上返回null,那么以下语句将抛出NullPointerException,因为无法将null赋值给基本类型:
```java boolean b = Boolean.valueOf(null); ```
但是,如果返回false,则不会发生异常,因为false可以安全地分配给boolean类型。
boolean b = Boolean.valueOf(null);

2
不错的观点。但是为什么 Integer.parseInt(null) 会抛出 NumberFormatException(null) - 难道自动装箱也适用于此吗? - vikingsteve
1
@vikingsteve:可以说,对于大多数用途而言,空字符串代表了一个假值。但是,空字符串应该代表什么整数呢?此外,正如Peter所指出的那样,Integer.parseInt已经返回一个int,而不是一个Integer。 - llogiq
1
如果你需要从一个字符串中获取一个布尔值,那么你应该使用 Boolean.parseBoolean 而不是 valueOf。一个错误的习惯,通过多余的装箱和立即拆箱的过程,如何能够证明任何 API 设计决策的正确性呢? - Marko Topolnik
1
总的来说,大多数JDK API都是围绕着快速失败的原则设计的,这迫使客户端在任何地方都要进行显式的空值检查,而不是返回合理的默认值。在这种情况下采用相反的原则需要更详细的阐述来证明其合理性。 - Marko Topolnik
1
@vikingsteve 如果按照JDK的精神,抛出一个“NullPointerException”并强制客户端实现显式的“null”哨兵策略会更好。 - Marko Topolnik
显示剩余2条评论

6
为什么Boolean.valueOf(String s)返回false而不是返回null,当s为空时呢?
这是一个有争议的问题,并且(坦白地说)没有必要提问…除非您碰巧正在设计自己的语言和运行时库。这个设计决策是在20多年前做出的,而在语言被称为“Java”的同时,它不会被改变。 Boolean.valueOf(String)的javadoc并没有提供任何关于为什么设计成这样的线索。
然而,很明显,Boolean.valueOf(String)的行为与其他基本包装类的valueOf(String)的行为是不一致的。例如,如果字符串参数为null,则Integer.valueOf(String)将抛出NumberFormatException。因此,真正的解释可能是Boolean.valueOf(String)语义只是不幸的异常情况,这是在匆忙发布Java 1.0时发生的疏忽造成的。
但这只是推测。要得到真正的答案,您需要查阅相关的Sun/Oracle内部文献来源(如果它们仍然存在),或者与原始Java团队中的某个人交谈(如果他们还记得)。

我对此有一个喜爱的猜测:Boolean.getBoolean,这个API中最为扭曲的巅峰显然可以追溯到Java早期,实际上有充分的理由在系统属性缺失时返回false。当然,它在内部依赖于Boolean.parseBoolean的API。 - Marko Topolnik

2
你可以使用三元运算符:
String s = ...
Boolean b = s != null ? Boolean.valueOf(s) : null;

1
然后,问题的最后一部分是,为什么Boolean.valueOf()的实际功能比返回null更好? - vikingsteve

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