isEmpty 和 isBlank的用法区别
前言
在业务代码中,字符判空经常出现
很久之前常用
String str="a"; if(str !=null && "a".equals(str)){}
后来发现 StringUtils.isEmpty()/StringUtils.isBlank()很好用 ,但是不清楚之间的区别,和使用场景。
1 梳理一下 org.apache.commons.lang3.StringUtils;下 这几个方法的作用,以及使用场景: isEmpty() / isBlank() isNotEmpty() / isNotBlank() isAnyEmpty()/isNoneEmpty() isAnyBlank()/ isNoneBlank();
maven依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>
一 、isEmpty系列
StringUtils.isEmpty()
是否为空。可以看到“ ” 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,或导致isEmpty(" ")=false
log.error("StringUtils.isEmpty(null)-------->{}",StringUtils.isEmpty(null)); log.error("StringUtils.isEmpty(\"\")-------->{}",StringUtils.isEmpty("")); log.error("StringUtils.isEmpty(\" \")-------->{}",StringUtils.isEmpty(" ")); log.error("StringUtils.isEmpty(\"\")-------->{}",StringUtils.isEmpty("bob")); log.error("StringUtils.isEmpty(\" bob \")-------->{}",StringUtils.isEmpty(" bob "));
源码
public static boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; }
接口中新增或者修改,往往会放在一个方法中 ,如果没有id 就是新增,有就是修改 ,如果用isEmpty()判断的话,前端又没有按规范传值,传个空字符过来,这时候就会出现问题。
StringUtils.isNotEmpty()
相当于不为空,=!isEmpty()
源码
public static boolean isNotEmpty(CharSequence cs) { return !isEmpty(cs); }
StringUtils.isAnyEmpty()
是否有一个为空,只有一个为空,就为true。
log.error("StringUtils.isAnyEmpty(null)-------->{}", StringUtils.isAnyEmpty(null)); log.error("StringUtils.isAnyEmpty(null,\"foo\")-------->{}", StringUtils.isAnyEmpty(null, "foo")); log.error("StringUtils.isAnyEmpty(\"\",\"bar\")-------->{}", StringUtils.isAnyEmpty("", "bar")); log.error("StringUtils.isAnyEmpty(\"bob\",\"\")-------->{}", StringUtils.isAnyEmpty("bob", "")); log.error("StringUtils.isAnyEmpty(\"bob\",null)-------->{}", StringUtils.isAnyEmpty("bob", null)); log.error("StringUtils.isAnyEmpty(\" \",\"bar\")-------->{}", StringUtils.isAnyEmpty(" ", "bar")); log.error("StringUtils.isAnyEmpty(\"foo\",\"bar\")-------->{}", StringUtils.isAnyEmpty("foo", "bar"));
注意点:网上很多文章 StringUtils.isAnyEmpty(null) 都是 true 但是我这里测试是false 有可能是版本的原因 我这里 commons-lang3 的版本是3.9
但是 2个null就是true
StringUtils.isNoneEmpty()
相当于! isAnyEmpty(css) ,必须所有的值都不为空才返回true
源码
public static boolean isNoneEmpty(CharSequence... css) { return !isAnyEmpty(css); }
二、isBlank系列
StringUtils.isBlank()
是否为真空值(空格或者空值)
log.error("StringUtils.isEmpty(null)-------->{}",StringUtils.isBlank(null)); log.error("StringUtils.isEmpty(\"\")-------->{}",StringUtils.isBlank("")); log.error("StringUtils.isEmpty(\" \")-------->{}",StringUtils.isBlank(" ")); log.error("StringUtils.isEmpty(\"bob\")-------->{}",StringUtils.isBlank("bob")); log.error("StringUtils.isEmpty(\" bob \")-------->{}",StringUtils.isBlank(" bob "));
可见空格也会当空判断,推荐使用 isBlank()
源码
public static boolean isBlank(CharSequence cs) { int strLen; if (cs != null && (strLen = cs.length()) != 0) { for(int i = 0; i < strLen; ++i) { if (!Character.isWhitespace(cs.charAt(i))) { return false; } } return true; } else { return true; } }
StringUtils.isNotBlank()
是否真的不为空,不是空格或者空值,相当于!isBlank();
public static boolean isNotBlank(CharSequence cs) { return !isBlank(cs); }
StringUtils.isAnyBlank()
是否包含任何真空值(包含空格或空值) 按道理来说只要有一个为空就为true
log.error("StringUtils.isAnyBlank(null)-------->{}", StringUtils.isAnyBlank(null)); log.error("StringUtils.isAnyBlank(null,\"foo\")-------->{}", StringUtils.isAnyBlank(null, "foo")); log.error("StringUtils.isAnyBlank(\"\",\"bar\")-------->{}", StringUtils.isAnyBlank("", "bar")); log.error("StringUtils.isAnyBlank(\"bob\",\"\")-------->{}", StringUtils.isAnyBlank("bob", "")); log.error("StringUtils.isAnyBlank(\"bob\",null)-------->{}", StringUtils.isAnyBlank("bob", null)); log.error("StringUtils.isAnyBlank(\" \",\"bar\")-------->{}", StringUtils.isAnyBlank(" ", "bar")); log.error("StringUtils.isAnyBlank(\"foo\",\"bar\")-------->{}", StringUtils.isAnyBlank("foo", "bar"));
与上面情况一致 StringUtils.isAnyBlank(null) 还是false StringUtils.isAnyBlank(null,null)还是false
源码
public static boolean isAnyBlank(CharSequence... css) { if (ArrayUtils.isEmpty(css)) { return false; } else { CharSequence[] var1 = css; int var2 = css.length; for(int var3 = 0; var3 < var2; ++var3) { CharSequence cs = var1[var3]; if (isBlank(cs)) { return true; } } return false; } }
StringUtils.isNoneBlank()
全不为空值或空格
log.error("StringUtils.isNoneBlank(null)-------->{}", StringUtils.isNoneBlank(null)); log.error("StringUtils.isNoneBlank(null,\"foo\")-------->{}", StringUtils.isNoneBlank(null, "foo")); log.error("StringUtils.isNoneBlank(\"\",\"bar\")-------->{}", StringUtils.isNoneBlank("", "bar")); log.error("StringUtils.isNoneBlank(\"bob\",\"\")-------->{}", StringUtils.isNoneBlank("bob", "")); log.error("StringUtils.isNoneBlank(\"bob\",null)-------->{}", StringUtils.isNoneBlank("bob", null)); log.error("StringUtils.isNoneBlank(\" \",\"bar\")-------->{}", StringUtils.isNoneBlank(" ", "bar")); log.error("StringUtils.isNoneBlank(\"foo\",\"bar\")-------->{}", StringUtils.isNoneBlank("foo", "bar"));
与上面情况一致
StringUtils.isNoneBlank(null) 是true StringUtils.isNoneBlank(null,null)是false