如果字符串为空,如何设置为 null 值?

6
有时开发人员会检查字符串是否为null值,如果是,则将这些字符串设置为空值:
if (text == null) {
    text = "";
}

我想要做的是编写相反的if语句:
if (text.isEmpty()) {
    text = null;
}

但是......首先 - 我必须检查(通常情况下)这个字符串是否为null,以避免NullPointerException,因此现在它看起来像这样(非常丑陋,但KISS):

if (!text == null) {
    if (text.isEmpty()) {
        text = null;
    }
}

我的课程有几个String字段,我需要为所有的字段准备这个解决方案。 对于更高效的代码,有什么基本的想法吗?将其扩展为lambda表达式,并在此类中迭代所有String字段,这是一个好方法吗?


3
为什么你想这样做,而不使用 Optional?为什么不尝试消除 null 的影响,而是把它作为一种有权重的值? - Dioxin
将其合并到外部if语句中。或者编写一个StringUtil.notNullAndEmpty(text)方法。 - XtremeBaumer
3
你从哪里得出了text.equals(null)这个表达式?这个表达式要么总是返回false,要么抛出NullPointerException异常。 - Henry
你有没有考虑使用 Kotlin?if (text?.isEmpty() != null),而且你甚至可以向 String 类添加方法,比如 String#toDisplay() - m0skit0
@VinceEmigh 我需要返回 如果为空则为null - designuj
7个回答

10

使用Guava的 emptyToNull 方法是另一种选择:

text = Strings.emptyToNull(text);

4

我不知道你提到流与你问题有什么关系,但如果你愿意使用Apache StringUtils库,那么一个选项是使用StringUtils#isEmpty()方法:

if (StringUtils.isEmpty(text)) {
    text = null;
}

2
只是个人意见,使用第三方库来完成如此微小的任务只是浪费。 - Naman
2
@nullpointer 实际上,也许Java应该直接在String类中包含这些方法,这将消除对第三方库的需求。我同意许多用例可能是边缘情况。 - Tim Biegeleisen
Java确实包含了方法,特别是在最新版本中。然而,尤其是这些具有null处理的Apache方法是朝着错误的方向迈出的一步。开发人员应该避免使用null,而不是使用这些实用程序方法。 - Holger

3

在你的例子中,如果text为null,那么text.equals(null)会导致NPE。你需要像这样做:

if (text != null && text.isEmpty()) {
    text = null;
}

如果您希望将空格也视为空,请在调用isEmpty()之前调用trim():
if (text != null && text.trim().isEmpty()) {
    text = null;
}

既然您希望重复使用此代码,那么将其作为实用方法是有意义的,您可以从任何类中调用它:

public static String setNullOnEmpty(final String text) {
    return text != null && text.trim().isEmpty() ? null : text;
}

1
你忘记在你的方法中插入return语句了。顺便提一下,从JDK 11开始,你可以使用text.isBlank()代替text.trim().isEmpty() - Holger
好的,谢谢。最近我一直在Groovy和Java之间切换,而Groovy不需要使用return语句。 - MikeM

1
您可以使用如下的一个if语句来完成同样的事情:
    if (text != null && text.isEmpty()) {
        text = null;
    }

完整的实用程序可能是这样的 private String checkEmptyAndNull(String text) { if (text != null && text.isEmpty()) { text = null; } return text; } - Naman
3
如果textnulltext.equals(null)始终为false,并且会导致NPE。只需编写text != null即可(但是OP犯了同样的错误)。 - Florian Albrecht
只是想说,他可以通过使用一个if语句来实现相同的效果,并且忽略了text.equals(null)部分。我的错。 - Sandeepa

1

不要使用equals()来检查字符串是否为null,而是应该使用:

if (text == null)

所以。
if (text != null && text.isEmpty()) {
    text = null;
}

这个1行代码只有在短路求值时才不会抛出NPE,如果textnull

0
我们在org.apache.commons.lang.StringUtils.trimToNull(s)中有一个方法,通过它我们可以将空字符串值转换为null值。
String text = StringUtils.trimToNull(emptyStringValue);

0

对于你的问题,我没有比已经发布的更好的答案。然而,我强烈质疑为什么你想将空字符串和null合并成null。通常来说,null是一个坏主意,引用Tony Hoare的话,“价值十亿美元的错误”,他本人发明了null引用。这篇博客文章提出了一些很好的论点!

你考虑过相反的方向吗?将任何null字符串转换为空字符串?这样你只需要处理大部分代码中的字符串,就不必担心null指针异常了。

更好的方法是看看Optional类型,它表示可能存在或不存在的对象。在Java 8中,这是一种比null更好的表示缺失的方式。这里有一篇博客文章解释了它。


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