Java 验证字符串为空或null的最佳方法
我相信以前一定有人以不同的方式问过这个问题,因为isEmptyOrNull非常常见,但人们的实现方式却不同。但我在下面提出了一个奇怪的问题,即对于内存和性能都有好处的最佳可用方法 1) 下面并没有说明所有空格,比如在XML标记为空的情况下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
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时返回trueApache 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));