验证字符串为空或 null 的最佳方法
Best way to verify string is empty or null
我相信之前一定有人以不同的方式问过这个问题——因为 isEmptyOrNull 很常见,但人们的实现方式却不同。但我有以下关于最佳可用方法的好奇查询,这对内存和性能都有好处。
1) 以下不考虑所有空格,例如空 XML 标签
return inputString==null || inputString.length()==0;
2) 下面一个注意但是 trim 可以吃一些性能 + 内存
return inputString==null || inputString.trim().length()==0;
3) 结合一和二可以节省一些性能和内存(正如 Chris 在评论中建议的那样)
return inputString==null || inputString.trim().length()==0 || inputString.trim().length()==0;
4) 转换为模式匹配器(仅当字符串长度不为零时调用)
private static final Pattern p = Pattern.compile("\s+");
return inputString==null || inputString.length()==0 || p.matcher(inputString).matches();
5) 使用像这样的库 -
阿帕奇公地 (StringUtils.isBlank/isEmpty
)
或 Spring (StringUtils.isEmpty
)
或番石榴 (Strings.isNullOrEmpty
)
或任何其他选项?
要检测字符串是否为 null 或空,您可以使用以下代码而不包括项目的任何外部依赖项并仍然保留您的代码 simple/clean:
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)){...}
只是为了表明java 8 删除空值的立场。
String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
...
}
如果可以使用 Optional<String>
就有意义了。
Apache Commons Lang 有 StringUtils.isEmpty(String str)
方法,如果参数为空或 null
,returns 为真
来自 Apache Commons 的有用方法:
org.apache.commons.lang.StringUtils.isBlank(String str)
来自 Google Guava 的这个可以同时签出 "null and empty String"。
Strings.isNullOrEmpty("Your string.");
使用 Maven 添加依赖项
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
和Gradle
dependencies {
compile 'com.google.guava:guava:20.0'
}
Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)
或
TextUtils.isNotBlank(label);
最后一个解决方案将检查 if not null 并同时修剪 str
简单明了:
if (str == null || str.trim().length() == 0) {
// str is empty
}
在大多数情况下,来自 apache commons 库的 StringUtils.isBlank(str)
可以解决它。但是如果存在被检查的输入字符串在引号内有空值的情况,则无法检查这种情况。
举个例子,我有一个使用 String.valueOf(obj)
API 转换为字符串的输入对象。如果 obj 引用为 null,则 String.valueOf returns "null" 而不是 null.
当您尝试使用 StringUtils.isBlank("null")
、API 时惨遭失败,您可能还必须检查此类用例以确保您的验证正确。
springframework library 检查给定的String是否为空。
f(StringUtils.isEmpty(str)) {
//.... String is blank or null
}
您可以使用 Optional 和 Apache commons Stringutils 库
Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);
此处它将检查 string1 是否不为空且不为空,否则它将 return string2
还没有看到任何 fully-native 解决方案,所以这里有一个:
return str == null || str.chars().allMatch(Character::isWhitespace);
基本上,使用本机 Character.isWhitespace() 函数。从那里,您可以实现不同级别的优化,具体取决于它的重要性(我可以向您保证,在 99.99999% 的用例中,不需要进一步优化):
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 java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class StringHelper {
public static Boolean hasBlank(String ... strings) {
Predicate<String> isBlank = s -> s == null || s.trim().isEmpty();
return Optional
.ofNullable(strings)
.map(Stream::of)
.map(stream -> stream.anyMatch(isBlank))
.orElse(false);
}
}
因此,您可以像 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));
我相信之前一定有人以不同的方式问过这个问题——因为 isEmptyOrNull 很常见,但人们的实现方式却不同。但我有以下关于最佳可用方法的好奇查询,这对内存和性能都有好处。
1) 以下不考虑所有空格,例如空 XML 标签
return inputString==null || inputString.length()==0;
2) 下面一个注意但是 trim 可以吃一些性能 + 内存
return inputString==null || inputString.trim().length()==0;
3) 结合一和二可以节省一些性能和内存(正如 Chris 在评论中建议的那样)
return inputString==null || inputString.trim().length()==0 || inputString.trim().length()==0;
4) 转换为模式匹配器(仅当字符串长度不为零时调用)
private static final Pattern p = Pattern.compile("\s+");
return inputString==null || inputString.length()==0 || p.matcher(inputString).matches();
5) 使用像这样的库 -
阿帕奇公地 (StringUtils.isBlank/isEmpty
)
或 Spring (StringUtils.isEmpty
)
或番石榴 (Strings.isNullOrEmpty
)
或任何其他选项?
要检测字符串是否为 null 或空,您可以使用以下代码而不包括项目的任何外部依赖项并仍然保留您的代码 simple/clean:
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)){...}
只是为了表明java 8 删除空值的立场。
String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
...
}
如果可以使用 Optional<String>
就有意义了。
Apache Commons Lang 有 StringUtils.isEmpty(String str)
方法,如果参数为空或 null
来自 Apache Commons 的有用方法:
org.apache.commons.lang.StringUtils.isBlank(String str)
来自 Google Guava 的这个可以同时签出 "null and empty String"。
Strings.isNullOrEmpty("Your string.");
使用 Maven 添加依赖项
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
和Gradle
dependencies {
compile 'com.google.guava:guava:20.0'
}
Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)
或
TextUtils.isNotBlank(label);
最后一个解决方案将检查 if not null 并同时修剪 str
简单明了:
if (str == null || str.trim().length() == 0) {
// str is empty
}
在大多数情况下,来自 apache commons 库的 StringUtils.isBlank(str)
可以解决它。但是如果存在被检查的输入字符串在引号内有空值的情况,则无法检查这种情况。
举个例子,我有一个使用 String.valueOf(obj)
API 转换为字符串的输入对象。如果 obj 引用为 null,则 String.valueOf returns "null" 而不是 null.
当您尝试使用 StringUtils.isBlank("null")
、API 时惨遭失败,您可能还必须检查此类用例以确保您的验证正确。
springframework library 检查给定的String是否为空。
f(StringUtils.isEmpty(str)) {
//.... String is blank or null
}
您可以使用 Optional 和 Apache commons Stringutils 库
Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);
此处它将检查 string1 是否不为空且不为空,否则它将 return string2
还没有看到任何 fully-native 解决方案,所以这里有一个:
return str == null || str.chars().allMatch(Character::isWhitespace);
基本上,使用本机 Character.isWhitespace() 函数。从那里,您可以实现不同级别的优化,具体取决于它的重要性(我可以向您保证,在 99.99999% 的用例中,不需要进一步优化):
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 java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class StringHelper {
public static Boolean hasBlank(String ... strings) {
Predicate<String> isBlank = s -> s == null || s.trim().isEmpty();
return Optional
.ofNullable(strings)
.map(Stream::of)
.map(stream -> stream.anyMatch(isBlank))
.orElse(false);
}
}
因此,您可以像 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));