apache-commons-lang3之StringUtils使用集锦

一.前言

1.CharSequence

StringUtils是处理字符串的工具类, String类实现CharSequence接口,为兼容不同实现类,StringUtils在处理字符串的传参为CharSequence类型

二.方法

1.判定是否为空

判定是否为空,包括是否为null,空串,空格字符串等,同时传参时区分单一参数与不定长参数集,其中empty结尾的函数校验null和空串,blank加上了对于空格字符串一类的无意义字符串的校验.

2.trim函数

StringUtils.trim(final String str){} 字符串修建函数trim()在String类自带trim函数的基础上,新增了对于null的支持,传参为null返回null,非空字符串的操作即去除首尾空格的一般操作,并基于此衍生除两个函数trimToNull -- 空串返回null 和 trimToEmpty -- null返回空串.

3.truncate函数

截取函数truncate基于String类的substring方法实现,变更了传参逻辑,String类的substring函数传参起始索引与终止索引,StringUtils工具类的truncate函数则传参根字符串/起始索引(偏移量)/截取长度,更多了一种截取选择,适应不同的使用场景,源码如下:

public static String truncate(final String str, final int offset, final int maxWidth) {
        if (offset < 0) {
            throw new IllegalArgumentException("offset cannot be negative");
        }
        if (maxWidth < 0) {
            throw new IllegalArgumentException("maxWith cannot be negative");
        }
        if (str == null) {
            return null;
        }
        if (offset > str.length()) {
            return EMPTY;
        }
        if (str.length() > maxWidth) {
            final int ix = offset + maxWidth > str.length() ? str.length() : offset + maxWidth;
            return str.substring(offset, ix);
        }
        return str.substring(offset);
 }

4.strip函数

strip函数与trim函数同属于字符串修剪方法实现, 不同在于trim处理字符串,strip可以对具体字符进行首尾的修剪,核心还是String类的substring函数,核心代码位于stripStart和stripEnd函数.

    public static String stripStart(final String str, final String stripChars) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return str;
        }
        int start = 0;
        if (stripChars == null) {
            while (start != strLen && Character.isWhitespace(str.charAt(start))) {
                start++;
            }
        } else if (stripChars.isEmpty()) {
            return str;
        } else {
            while (start != strLen && stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND) {
                start++;
            }
        }
        return str.substring(start);
    }
    public static String stripEnd(final String str, final String stripChars) {
        int end;
        if (str == null || (end = str.length()) == 0) {
            return str;
        }

        if (stripChars == null) {
            while (end != 0 && Character.isWhitespace(str.charAt(end - 1))) {
                end--;
            }
        } else if (stripChars.isEmpty()) {
            return str;
        } else {
            while (end != 0 && stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND) {
                end--;
            }
        }
        return str.substring(0, end);
    }

5.equals函数

比较字符串是否相等,核心是CharSequenceUtils.regionMatch函数,逐字符比较,可区分大小写,出现不同即返回,包括equals和equalsIgnoreCase两种实现,以及拓展的对于不定长参数集equalsAny/equalsAnyIgnoreCase的支持.

6.compare函数

比较两个字符串,可区分大小写,核心逻辑为String.compareTo函数, 比较编码大小,返回第一个不同的差值,相同则返回0,整体业务逻辑类似equals,同时包含对于空参的支持,具体实现为compare和compareIgnoreCase

7.indexOf函数

获取字符串中子串索引,核心逻辑为CharSequenceUtils.indexOf(seq, searchChar, startPos)函数,此处包含场景比较多,包括从字符串起始位置/指定位置,顺序查找/逆序查找,简列如下:

indexOf(final CharSequence seq, final int searchChar / final CharSequence serchSeq) 
-- 获取字符(ASCII编码)位于字符串起始开始的第一个位置索引
indexOf(final CharSequence seq, final int searchChar / final CHarSequence searchSeq, final int startPos)
-- 获取字符(ASCII编码)位于字符串指定起始位置开始的第一个位置索引

8.contains函数

字符串参数间的包含关系,核心逻辑为CharSequenceUtils.indexOf(seq, searchChar, startPos)函数,如果子串在字符串的索引不小于零,则包含;对于空格的包含containsWhitespace则是遍历字符串逐一判定.

    public static boolean contains(final CharSequence seq, final CharSequence searchSeq) {
        if (seq == null || searchSeq == null) {
            return false;
        }
        return CharSequenceUtils.indexOf(seq, searchSeq, 0) >= 0;
    }

9.substring函数

StringUtils工具类对substring函数的应用场景足够细化,可应用多种场景,除开3,4的truncate和strip,另有细化的使用场景,例如首部/尾部/中间等位置开始截取的left/right/mid,指定子串位置开始的截取,包括substringBefore/substringAfter/substringBeforeLast/substringAfterLast/...