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

 

posted @ 2021-11-11 23:55  KwFruit  阅读(325)  评论(0编辑  收藏  举报