Java 验证字符串为空或null的最佳方法

Java 验证字符串为空或null的最佳方法,java,regex,string,trim,is-empty,Java,Regex,String,Trim,Is Empty,我相信以前一定有人以不同的方式问过这个问题,因为isEmptyOrNull非常常见,但人们的实现方式却不同。但我在下面提出了一个奇怪的问题,即对于内存和性能都有好处的最佳可用方法 1) 下面并没有说明所有空格,比如在XML标记为空的情况下 return inputString==null || inputString.length()==0; 2) 下面的一个注意,但修剪可以吃一些性能+内存 return inputString==null || inputString.trim().leng

我相信以前一定有人以不同的方式问过这个问题,因为isEmptyOrNull非常常见,但人们的实现方式却不同。但我在下面提出了一个奇怪的问题,即对于内存和性能都有好处的最佳可用方法

1) 下面并没有说明所有空格,比如在XML标记为空的情况下

return inputString==null || inputString.length()==0;
2) 下面的一个注意,但修剪可以吃一些性能+内存

return inputString==null || inputString.trim().length()==0;
3) 将一和二结合起来可以节省一些性能和内存(正如Chris在评论中所建议的)

4) 转换为模式匹配器(仅当字符串长度非零时调用)

5) 像这样使用库- Apache Commons(
StringUtils.isBlank/isEmpty
) 或弹簧(
StringUtils.isEmpty
) 或者番石榴(
Strings.isNullOrEmpty

或任何其他选项?

要检测字符串是否为null或空,您可以使用以下选项,而无需在项目中包含任何外部依赖项,并保持代码简单/干净:

if(myString==null || myString.isEmpty()){
    //do something
}
或者如果还需要检测空白:

if(myString==null || myString.trim().isEmpty()){
    //do something
}
您可以轻松地将这些方法包装到实用程序方法中,使其更加简洁,因为这些方法是非常常见的检查:

public final class StringUtils{

    private StringUtils() { }   

    public static bool isNullOrEmpty(string s){
        if(s==null || s.isEmpty()){
            return true;
        }
        return false;
    }

    public static bool isNullOrWhiteSpace(string s){
        if(s==null || s.trim().isEmpty()){
            return true;
        }
        return false;
    }
}
然后通过以下方式调用这些方法:

if(StringUtils.isNullOrEmpty(myString)){…}


if(StringUtils.isNullOrWhiteSpace(myString)){…}

只是为了显示Java8删除空值的立场

String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
    ...
}

如果您可以使用
可选

Apache Commons Lang具有
StringUtils.isEmpty(String str)
方法,该方法在参数为空或为null时返回true

Apache Commons中的有用方法:

 org.apache.commons.lang.StringUtils.isBlank(String str)

谷歌番石榴(Google Guava)的这一款可以同时检出“空字符串和空字符串”

Strings.isNullOrEmpty("Your string.");
使用Maven添加依赖项

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>20.0</version>
</dependency>

TextUtils.isNotBlank(标签)

最后一个解决方案将检查是否不为null,并同时修剪str

简单明了:
在大多数情况下,ApacheCommons库中的
StringUtils.isBlank(str)
可以解决这个问题。但若存在这样的情况,即被检查的输入字符串在引号中有空值,那个么它将无法检查这样的情况

举个例子,我有一个输入对象,它使用
string.valueOf(obj)
API转换成字符串。如果obj引用为null,String.valueOf将返回“null”而不是null


当您尝试使用,
StringUtils.isBlank(“null”)
时,API会失败得很惨,您可能还需要检查此类用例以确保验证正确。

springframework库检查给定字符串是否为空

f(StringUtils.isEmpty(str)) {
    //.... String is blank or null
}

您可以使用可选的和Apache commons Stringutils库

Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);

在这里,它将检查string1是否不为null且不为空,否则它将返回string2

未看到任何完全本机解决方案,因此这里有一个:

return str == null || str.chars().allMatch(Character::isWhitespace);
基本上,使用本机字符.isWhitespace()函数。从那里,您可以实现不同级别的优化,这取决于它的重要性(我可以向您保证,在99.99999%的用例中,不需要进一步优化):

或者,为了达到最佳效果(但赫卡丑陋):

int-len;
if(str==null | |(len=str.length())==0)返回true;
对于(int i=0;i
我喜欢做一件事:

Optional<String> notBlank(String s) {
  return s == null || s.chars().allMatch(Character::isWhitepace))
    ? Optional.empty()
    : Optional.of(s);
}

...

notBlank(myStr).orElse("some default")
可选非空(字符串s){
返回s==null | | s.chars().allMatch(Character::iswhitespace))
?可选。空()
:可选。共个;
}
...
notBlank(myStr.orElse(“某些默认值”)

如果必须在同一验证中测试多个字符串,可以执行以下操作:

import java.util.Optional;
导入java.util.function.Predicate;
导入java.util.stream.stream;
公共类StringHelper{
公共静态布尔值为空(字符串…字符串){
谓词isBlank=s->s==null | | s.trim().isEmpty();
返回可选
.可使用的(字符串)
.map(流::of)
.map(stream->stream.anyMatch(isBlank))
.orElse(假);
}
}

因此,您可以像
StringHelper.hasBlank(“Hello”,null,“,”)
StringHelper.hasBlank(“Hello”)
这样以通用形式使用它。

对于openJDK 11,您可以使用内部验证来检查字符串是否为null或只是空格

import jdk.internal.joptsimple.internal.Strings;
...

String targetString;
if (Strings.isNullOrEmpty(tragetString)) {}

我们可以利用下面的方法

Optional.ofNullable(result).filter(res -> StringUtils.isNotEmpty(res))
            .ifPresent( s-> val.set(s));

输入字符串=null&&inputString.isEmpty();更精致的输入字符串=null&&inputString.trim().isEmpty();您还可以使用Apache字符串utils,这将执行空检查和空间检查。
isEmpty
在java 6中是“新”的,旧的或希望保持java 5兼容的实现将必须使用长度检查。如果使用
return inputString==null | | inputString.length()==0 | | inputstrim().length()=0(结合1和2),则仅对非零长度字符串调用trim。你也可以加上3个,番石榴有Strings.isNullOrEmpty(),我现在用得最多!谢谢。我每次都不可避免地犯这个错误,然后编译它,看到错误,我意识到我已经犯了90亿次这个错误:)@zapl或java中的语句是短路的。如果我的字符串是null@JamesWierzba答案是
如果(s.isEmpty | | s==null)
在null的情况下与NPE短路:)删除注释以避免混淆。它不考虑空格:)字符串现在有一个.isBlank()方法感谢Joop,我认为这也是一个干净的解决方案-它不适用于像“.”这样的多空格空白字符串。@prash:为良好的顺序添加了修剪,但apache commons是无与伦比的。;)我不得不说,我认为Optional的使用就像一种疾病一样感染了Java社区。我从来没有见过一个功能,需要这么多额外的打字来实现是如此简单,但采用了这么多羊的时候,竞争对手
Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);
return str == null || str.chars().allMatch(Character::isWhitespace);
return str == null || str.length() == 0 || str.chars().allMatch(Character::isWhitespace);
int len;
if (str == null || (len = str.length()) == 0) return true;
for (int i = 0; i < len; i++) {
  if (!Character.isWhitespace(str.charAt(i))) return false;
}
return true;
Optional<String> notBlank(String s) {
  return s == null || s.chars().allMatch(Character::isWhitepace))
    ? Optional.empty()
    : Optional.of(s);
}

...

notBlank(myStr).orElse("some default")
import jdk.internal.joptsimple.internal.Strings;
...

String targetString;
if (Strings.isNullOrEmpty(tragetString)) {}
Optional.ofNullable(result).filter(res -> StringUtils.isNotEmpty(res))
            .ifPresent( s-> val.set(s));