检查一个字符串是否既不为null也不为空。

561

如何检查一个字符串既不是 null 也不是空的?

public void doStuff(String str)
{
    if (str != null && str != "**here I want to check the 'str' is empty or not**")
    {
        /* handle empty string */
    }
    /* ... */
}

8
最好使用 PreparedStatement 等代替通过字符串连接原语构建 SQL 查询。这样可以避免各种注入漏洞,而且更易读等。 - polygenelubricants
2
你可以创建一个类来检查空值或空对象。这将有助于提高可重用性。http://stackoverflow.com/a/16833309/1490962 - Bhushankumar Lilapara
此条件可以用java.util.function.Predicate表达,如下所示:Predicate.<String>isEqual(null).or(String::isEmpty).negate(),具体解释请参考这里 - Alexander Ivanchenko
35个回答

8
根据输入返回true或false。
Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);

7

使用Apache StringUtils的isNotBlank方法,如下所示:

StringUtils.isNotBlank(str)

仅当字符串不为空且不为null时,它才会返回true。


1
实际上,如果 str 在此处为空,则该语句返回 true。 - Alexandr
没错,我的错!使用apache-commons的StringUtils.isNotEmpty(str)就可以完成任务了。 - A Null Pointer

7
您可以使用函数式的检查方式:
Optional.ofNullable(str)
    .filter(s -> !(s.trim().isEmpty()))
    .ifPresent(result -> {
       // your query setup goes here
    });

2
我建议使用map来进行修剪,例如: Optional.ofNullable(str) .map(String::trim) .filter(String::isEmpty) .ifPresent(this::setStringMethod); - bachph

7
你应该使用org.apache.commons.lang3.StringUtils.isNotBlank()org.apache.commons.lang3.StringUtils.isNotEmpty。这两者之间的选择基于您实际想要检查的内容。 isNotBlank()检查输入参数是否:
- 不为空(Not Null) - 不是空字符串("") - 不是一系列空格字符(" ") isNotEmpty()仅检查输入参数是否:
- 不为 null - 不是空字符串("")

5

如果您不想包含整个库,只需包含所需的代码。 您将不得不自己维护它; 但这是一个非常简单明了的功能。 在这里,它从commons.apache.org复制。

    /**
 * <p>Checks if a String is whitespace, empty ("") or null.</p>
 *
 * <pre>
 * StringUtils.isBlank(null)      = true
 * StringUtils.isBlank("")        = true
 * StringUtils.isBlank(" ")       = true
 * StringUtils.isBlank("bob")     = false
 * StringUtils.isBlank("  bob  ") = false
 * </pre>
 *
 * @param str  the String to check, may be null
 * @return <code>true</code> if the String is null, empty or whitespace
 * @since 2.0
 */
public static boolean isBlank(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0) {
        return true;
    }
    for (int i = 0; i < strLen; i++) {
        if ((Character.isWhitespace(str.charAt(i)) == false)) {
            return false;
        }
    }
    return true;
}

3
简单解决方案:

private boolean stringNotEmptyOrNull(String st) {
    return st != null && !st.isEmpty();
}

3

测试使用相同条件句进行空字符串和null的比较:

if(!"".equals(str) && str != null) {
    // do stuff.
}

如果 str 为 null,equals() 方法不会抛出 NullPointerException 异常,因为 Object.equals() 方法如果参数为 null 会返回 false。

另一种构造方法 str.equals("") 会抛出令人恐惧的 NullPointerException 异常。有些人可能认为在调用 equals() 方法时使用字符串字面量作为对象是一种不好的做法,但这样做可以达到预期效果。

还可以查看这个答案:https://dev59.com/CHRB5IYBdhLWcg3wuZjo#531825


1
那么为什么要添加永远不会被执行的代码str != null!"".equals(str)已经完成了它的工作。 - amdev

2

如果您正在使用Java 8并希望采用更多的函数式编程方法,您可以定义一个Function来管理控制,然后在需要时重复使用它和apply()

具体实践方面,您可以将Function定义为

Function<String, Boolean> isNotEmpty = s -> s != null && !"".equals(s)

然后,您可以通过简单调用apply()方法来使用它,例如:
String emptyString = "";
isNotEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
isNotEmpty.apply(notEmptyString); // this will return true

如果您喜欢的话,可以定义一个Function来检查String是否为空,然后使用!对其取反。
在这种情况下,Function将如下所示:
Function<String, Boolean> isEmpty = s -> s == null || "".equals(s)

然后,您只需调用apply()方法即可使用它:

String emptyString = "";
!isEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
!isEmpty.apply(notEmptyString); // this will return true

这是我喜欢的做法,当我担心性能成本或副作用,并且没有现成的导入可用时。 - david.pfx

2

使用Java 8 Optional,你可以做到以下几点:

public Boolean isStringCorrect(String str) {
    return Optional.ofNullable(str)
            .map(String::trim)
            .map(string -> !str.isEmpty())
            .orElse(false);
}

在这个表达式中,您将处理包含空格的字符串。

2

正如seanizer所说,如果您想使用Apache StringUtils进行字符串操作,那么它非常出色。如果您想使用guava,请按照以下步骤操作:

public List<Employee> findEmployees(String str, int dep) {
 Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
 /** code here **/
}

我还可以建议您使用列名而不是索引来引用结果集中的列,这将使您的代码更易于维护。


不过,无需使用guava中的apache commons,因为guava中也有一个Strings类:http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Strings.html - Sean Patrick Floyd
我为那些初学Java的用户添加了一些Guava示例,这些用户可能会在这个问题上着陆:https://dev59.com/JnA65IYBdhLWcg3w2iip#13146903。 - Adam Gent

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