我确信之前必须以不同的方式提出这个问题 - 因为isEmptyOrNull是如此常见但人们以不同的方式实现它。但我对最佳可用方法有好奇的查询,这对于内存和性能都有好处。
1)下面没有考虑所有空格,例如空XML标记
return inputString==null || inputString.length()==0;
2)下面一个小心,但修剪可以吃一些性能+记忆
return inputString==null || inputString.trim().length()==0;
3)转换为模式匹配器(仅当字符串非零长度时调用)
private static final Pattern p = Pattern.compile("\\s+");
return inputString==null || inputString.length()==0 || p.matcher(inputString).matches();
4)还有其他吗?
Apache Commons的有用方法:
org.apache.commons.lang.StringUtils.isBlank(String str)
您可以使用Optional和Apache commons Stringutils库
Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);
这里它将检查string1是否为空并且不为空,否则它将返回string2
没有看到任何完全原生的解决方案,所以这里是一个:
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")
。
要检测字符串是空还是空,您可以使用以下内容,而不在项目中包含任何外部依赖项,并且仍然保持代码简单/干净:
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>
,这是有道理的。
来自Google Guava的这个可以在同一时间检出“null和空字符串”。
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'
}
Apache Commons Lang有StringUtils.isEmpty(String str)
方法,如果参数为空或null,则返回true
Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)
要么
TextUtils.isNotBlank(label);
最后一个解决方案将检查是否为null并同时修剪str
在大多数情况下,来自apache commons库的StringUtils.isBlank(str)
会解决它。但是,如果存在大小写,其中检查的输入字符串在引号内具有空值,则无法检查此类情况。
举个例子,我有一个使用String.valueOf(obj)
API转换成字符串的输入对象。如果obj引用为null,则String.valueOf返回“null”而不是null。
当您尝试使用StringUtils.isBlank("null")
,API失败时,您可能必须检查此类用例以确保您的验证正确。
if (str == null || str.trim().length() == 0) {
// str is empty
}
springframework library检查给定的String是否为空。
f(StringUtils.isEmpty("")) {
//.... String is blank or null
}