Apache Commons Lang使用总结

StringUtils

img
package lang3;

import lang3.util.Log;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

import java.util.Locale;

import static org.apache.commons.lang3.StringUtils.*;

/**
 * StringUtilsDemo
 * <p>
 * 空白字符
 * 空格 \s
 * 回车 \n
 * 换行 \r
 * 制表 \t
 * <p>
 *
 * @author Feathers
 * @date 2018-05-18 14:15
 */
public class StringUtilsDemo {

    public static final String NULL = "Null";
    public static final String EMPTY = "Empty";

    public static final String STR_NULL = null;
    public static final String STR_EMPTY = "";
    public static final String STR_BLANK = "  ";

    @Test
    public void testConstant() {
        String cr = StringUtils.CR; // \r
        String lf = StringUtils.LF; // \n
        String space = StringUtils.SPACE; // " "
        String empty = StringUtils.EMPTY; // ""
    }

    @Test
    public void testLength() {
        Log.i(length(null));
    }

    /**
     * 字符串数据类型判断
     */
    @Test
    public void testIs() {

        Log.i("判断字符串是否为Empty", isEmpty(""));
        Log.i("判断字符串是否为Blank", isBlank("\n\t "));
        Log.i("判断字符是否不是Empty", isNoneEmpty(""));
        Log.i("判断字符是否不是Blank", isNoneBlank(" "));

        Log.i("判断字符串内容是否为数字 123", isNumeric("123"));
        Log.i("判断字符串内容是否为数字 123 ", isNumeric("123 "));
        Log.i("判断字符串内容是否为数字 123.4", isNumeric("123.4"));
        Log.i("判断字符串内容是否为数字 12 3", isNumeric("12 3"));

        Log.i("判断字符串是否为纯Unicode字符组成", isAlpha("啊打发"));
        Log.i("判断字符串是否为纯Unicode字符组成 2,\\n, \\s等字符都属于ASCII", isAlpha("啊打发2"));
        Log.i("判断字符串是否为纯Unicode字符组成 空字符串/null会返回false", isAlpha(""));
        Log.i("判断字符串是否为纯Unicode字符以及空格组成", isAlphaSpace("沙发上 "));
        Log.i("判断字符串是否为纯Unicode字符以及数字组成", isAlphanumeric("沙发上123"));
        Log.i("判断字符串是否为纯Unicode字符以及数字和空格组成", isAlphanumericSpace("沙发上 123"));

        Log.i("判断字符串是否全为小写字母", isAllLowerCase("ad"));
        Log.i("判断字符串是否全为小写字母,只允许出现小写字母,如果有其他字符,比如汉字、数字,会返回false", isAllLowerCase("ads123"));
        Log.i("判断字符串是否全为大写字母", isAllUpperCase("AD"));
        Log.i("判断字符串时大小写混合", isMixedCase("ADa"));
        Log.i("判断字符串时大小写混合 可以包含其他中文、数字字符", isMixedCase("ADa 哈"));

    }

    /**
     * trim 操作只会去除字符串两侧的空白字符
     * 去空格操作 trim   if null then null
     * 去空格操作 trimToEmpty if null/"" then ""
     */
    @Test
    public void testTrim() {
        Log.i("---------trim------");
        Log.i("a_b", trim("a b"));
        Log.i(NULL, trim(STR_NULL));

        Log.i("--------trimToNull------");
        Log.i(NULL, trimToNull(STR_NULL));
        Log.i(EMPTY, trimToNull(STR_EMPTY));

        Log.i("--------trimToEmpty------");
        Log.i(NULL, trimToEmpty(STR_NULL).length());
        Log.i(EMPTY, trimToEmpty(STR_EMPTY).length());
    }

    /**
     * 移除字符串文本末尾出的\n,\r,\n\r 即回车符
     */
    @Test
    public void testChomp() {
        Log.i(chomp("a\n\r"));
    }

    /**
     * 去除指定的字符,如果不传,则默认去除空白字符
     * strip 去除两侧占位符
     * stripStart 去除字符串开始的指定字符
     * stripEnd 去除字符串结束的指定字符
     * stripAll 批量处理
     * stripAccents 去除字符串中的变音符号 #,b,x,bb,ヰ
     */
    @Test
    public void testStrip() {
        Log.i("---------strip-----------");
        String target = " a b ";
        Log.i("去除两侧的空白字符\t\t", strip(target));
        Log.i("去除两侧的指定字符\t\t", strip(target, "\\s"));
        Log.i("去除开始的的指定字符\t", stripStart(target, "\\s"));
        Log.i("去除字符串结束的指定字符\t", stripEnd(target, "\\s"));

        Log.i("---------stripToEmpty-----------");
        // 将空白字符进行strip操作,如果得到""或null 则返回 ""
        Log.i(EMPTY, stripToEmpty(STR_BLANK));

        Log.i("---------stripToNull-----------");
        // 将空白字符进行strip操作,如果得到""或null 则返回 null
        Log.i(NULL, stripToNull(STR_BLANK));

        Log.i("---------stripAll-----------");
        String[] strings1 = stripAll(" \n", " \t");
        Log.i("StripAll 去除空白字符", strings1);
        String[] strings2 = stripAll(new String[]{"ab", "acb", "adb"}, "b");
        Log.i("StripAll 去除指定字符", strings2);

        Log.i("----------stripAccents---------");
        Log.i(stripAccents("éclair"));

    }

    /**
     * 给字符串设置默认值
     * defaultString 如果字符串是 null 则设置默认字符串,默认字符串默认为""空字符串
     * defaultIfEmpty 如果字符串是空字符串,则设置默认字符串
     * defaultIfBlank 如果字符串是blank字符串,则设置默认字符串
     */
    @Test
    public void testDefault() {
        String defaultText = "我是默认文字";

        Log.i("defaultString", defaultString(null));
        Log.i("defaultString2", defaultString(null, defaultText));

        Log.i("defaultIfEmpty", defaultIfEmpty("", defaultText));
        Log.i("defaultIfBlank", defaultIfEmpty("   ", defaultText));
    }

    /**
     * 字符串比较
     */
    @Test
    public void testEquals() {
        Log.i("null eq null", StringUtils.equals(null, null));
        Log.i("忽略大小写比较", equalsIgnoreCase("a", "A"));
        Log.i("多个字符串与同一字符串比较", equalsAny("abc", "abd", "abc"));
        Log.i("多个字符串与同一字符串忽略大小写比较", equalsAnyIgnoreCase("abc", "abd", "ABC"));
    }

    /**
     * 字符串比较(大小比较,字典顺序)
     * 当前字符串1的字典顺序高于字符串2是,返回-1 否则返回 1
     */
    @Test
    public void testCompare() {
        Log.i("字符串比较", compare("abc", "abc"));
        Log.i("字符串比较", compare("abc", "abd"));
        Log.i("字符串比较", compare("abc", "abcd"));
        Log.i("字符串比较", compare("abd", "abc"));

        Log.i("字符串比较 忽略大小写", compareIgnoreCase("Abd", "abc"));
    }

    /**
     * 字符串查找
     */
    @Test
    public void testIndexOf() {

        Log.i("-------------indexOf-------------");
        Log.i("查找字符串a在字符串b中的位置", indexOf("abc", "a"));
        Log.i("如果没有查找到,返回-1", indexOf("abc", "d"));
        Log.i("如果两个字符串其中有一个未null,则返回-1", indexOf("abc", null));

        Log.i("指定位置开始查找", indexOf("abc", "b", 1));
        Log.i("查找字符", indexOf("abc", 'a'));

        Log.i("-------------indexOfIgnoreCase-------------");
        Log.i("忽略大小写查找", indexOfIgnoreCase("abc", "Ab"));

        Log.i("--------------ordinalIndexOf------------");
        Log.i("查找字符串在目标字符串中出现第ordinal次时的位置", ordinalIndexOf("abcb", "b", 2));

        Log.i("--------------indexOfDifference------------");
        Log.i("查找两个字符串开始不同的位置", indexOfDifference("abcd", "abde"));

        Log.i("---------------indexOfAny-------------------");
        Log.i("查找多个字符在目标字符串的位置", indexOfAny("abc", "a", "b"));

        Log.i("---------------indexOfAnyBut-------------------");
        Log.i("查找字符串不在目标字符串的位置", indexOfAnyBut("abc", "ab"));

        Log.i("--------------lastIndexOf-------------");
        Log.i("从后往前查找", lastIndexOf("abca", "a"));
        Log.i("从后往前忽略大小写查找", lastIndexOfIgnoreCase("abca", "A"));

    }

    /**
     * 字符串包含检查操作 contains
     */
    @Test
    public void testContains() {
        Log.i("检查字符串中是否有某个字符", contains("\na", 'a'));
        Log.i("检查字符串中是否有某个字符串", contains("\na", "a"));

        Log.i("检查字符串中是否有某些字符", containsAny("aa", 'a', 'c'));
        Log.i("检查字符串中是否有某些字符串", containsAny("aa", "c", "d"));

        Log.i("检查字符串中是否有空白字符", containsWhitespace(""));
        Log.i("检查字符串中是否有空白字符", containsWhitespace("\na"));

        Log.i("忽略大小写检查", contains("\na", "A"));

        Log.i("检查字符串中是否只包含某个字符", containsOnly("aaa", 'a'));
        Log.i("检查字符串中是否只包含某个字符串", containsOnly("aaac", "a"));

        Log.i("检查字符串中是否不包含参数二的字符", containsNone("aaac", 'd'));
        Log.i("检查字符串中是否不包含参数二的字符串", containsNone("aaac", "c"));

    }

    /**
     * 字符串开始结尾字符判断
     */
    @Test
    public void testStartEnd() {
        Log.i("判断字符串是否以某一字符串开始", startsWith("123_test", "123"));
        Log.i("判断字符串是否以任意列表中的字符串结束", startsWithAny("123_test", "123", "124"));
        Log.i("忽略大小写判断", startsWithIgnoreCase("123A_test", "123a"));

        Log.i("判断字符串是否以某一字符串结束", endsWith("123_test", "test"));
        Log.i("判断字符串是否以任意列表字符串字符串结束", endsWithAny("123_test", "test", "ha"));
        Log.i("忽略大小写判断", endsWithIgnoreCase("123_test", "Test"));
    }

    /**
     * 字符串截取
     */
    @Test
    public void testSubstring() {
        Log.i("截取[start, ends)的字符串", substring("abcd", 2, 3));
        Log.i("从指定位置截取字符", substring("abcd", 2));
        Log.i("从指定字符串位置开始截取该字符前面的字符串(从左向右查找该字符串)", substringBefore("abcd", "b"));
        Log.i("从指定字符串位置开始截取该字符前面的字符串(从右向左查找该字符串)", substringBeforeLast("abcd", "b"));

        Log.i("从指定字符串位置开始截取该字符后面的字符串(从左向右查找该字符串)", substringAfter("abcd", "b"));
        Log.i("从指定字符串位置开始截取该字符后面的字符串(从右向左查找该字符串)", substringAfterLast("abcd", "b"));

        Log.i("找到两个tag字符之间的字符并截取", substringBetween("abcda", "a"));
        Log.i("从指定指定start字符串的位置截取end字符的位置的字符串", substringBetween("abcd", "a", "d"));
        Log.i("从指定指定start字符串的位置截取end字符的位置的字符串, 将符合情况的全部输出", substringsBetween("abcdabecd", "a", "d"));

        Log.i("-------------left, right, mid----------------");
        Log.i("从左开始截取长度为len的字符串", left("abcd", 2));
        Log.i("从右开始截取长度为len的字符串", right("abcd", 2));
        Log.i("从pos位置开始截取,截取len长度的字符串", mid("abcd", 2, 2));
    }

    /**
     * 字符串截取
     */
    @Test
    public void testTruncate() {
        Log.i("从0开始截取五个字符作为一个字符串",StringUtils.truncate("abcdefghijk", 5));
        Log.i("从1开始截取五个字符作为一个字符串",StringUtils.truncate("abcdefghijk", 1,5));
    }

    /**
     * 字符串分割
     */
    @Test
    public void testSplit() {
        Log.i("使用空格将字符串分割为数组", split("a b c "));
        Log.i("使用指定字符串将字符串分割为数组", split("a,b,c,", ","));
        Log.i("使用指定字符串将字符串分割为数组", split("a,b,c,,", ","));

        Log.i("whole使用指定字符串将字符串分割为数组", splitByWholeSeparator("a,b,c,", ","));
        Log.i("whole使用指定字符串将字符串分割为数组,默认同样使用空格", splitByWholeSeparator("a b c", null));
        Log.i("whole使用指定字符串将字符串分割为数组,空字符串不会被忽略", splitByWholeSeparator("a,b,c,,", ","));
        Log.i("whole使用指定字符串将字符串分割为数组,设置数组最大长度", splitByWholeSeparator("a,b,c", ",", 2));
        Log.i("whole使用指定字符串将字符串分割为数组,设置数组最大长度 元素1为", splitByWholeSeparator("a,b,c", ",", 2)[1]);

        Log.i("按照字符串数据的不同类型进行分割", splitByCharacterType("abcABC!!!123a"));
        Log.i("按照字符串数据的不同类型进行分割,并且忽略大小写", splitByCharacterTypeCamelCase("abcABC!!!123a"));

        Log.i("splitPreserveAllTokens和whole作用相同,不忽略空白项", splitPreserveAllTokens("a b c "));
    }

    /**
     * 字符串拼接
     */
    @Test
    public void testJoin() {
        String[] as = new String[]{"a", "b", "c"};

        Log.i("将数组拼接为字符串,默认以空字符串为连接符", join(as));
        Log.i("将数组拼接为字符串,使用指定连接符", join(as, ","));
        Log.i("将数组指定位置的元素使用指定连接符拼接为字符串", join(as, ",", 2, 3));
    }

    /**
     * 字符串字符移除操作
     */
    @Test
    public void testRemove() {

        Log.i("移除字符串中的某个字符串(移除所有匹配)", remove("abcabc", "a"));
        Log.i("移除字符串中的某个字符串(移除匹配正则的所有字符串,和remove类似)", removePattern("abcabc", "a"));
        Log.i("移除字符串中的某个字符串(移除从左到右第一个匹配)", removeFirst("abcabc", "b"));

        Log.i("移除字符串中的某个字符串(如果头部有该字符串,则移除)", removeStart("abcabc", "a"));
        Log.i("移除字符串中的某个字符串(如果头部有该字符串,则移除,忽略大小写)", removeStartIgnoreCase("abcabc", "A"));
        Log.i("移除字符串中的某个字符串(如果尾部有该字符串,则移除)", removeEnd("abcabc", "c"));
        Log.i("移除字符串中的某个字符串(如果尾部有该字符串,则移除,忽略大小写)", removeEndIgnoreCase("abcabc", "c"));
    }

    /**
     * 删除方法
     */
    @Test
    public void testDelete() {
        Log.i("删除所有空白符", deleteWhitespace("a b \nd"));
    }

    /**
     * 字符串替换
     */
    @Test
    public void testReplace() {
        Log.i("替换字符串(所有匹配的都会被替换)", replace("abcabc", "a", "e"));
        Log.i("替换字符串(所有匹配的都会被替换)", replaceChars("abcabc", "a", "e"));
        Log.i("替换字符串(所有匹配的都会被替换)", replaceChars("abcabc", 'a', 'e'));
        Log.i("替换字符串(所有匹配的都会被替换, 但是最多替换max次)", replace("abcabc", "a", "e", 1));

        Log.i("替换字符串(忽略大小写)", replaceIgnoreCase("abcabc", "A", "e"));
        Log.i("替换字符串(忽略大小写,最多被替换max次)", replaceIgnoreCase("abcabc", "A", "e", 1));

        Log.i("替换字符串(只替换第一个匹配的)", replaceFirst("abcabc", "a", "e"));
        Log.i("替换字符串(只替换一次)", replaceOnce("abcabc", "a", "e"));

        Log.i("替换字符串,使用指定的正则表达式", replacePattern("abcabc", "a", "e"));

        Log.i("增强替换,只替换一次,如果两个参数数组长度不一致,会抛出非法参数异常",
                replaceEach("bcacab", new String[]{"a", "b", "c"}, new String[]{"d", "e", "f"}));
        Log.i("增强替换,替换多次,比如将a替换为b,b再替换为c,c替换为d,结果为dddddd",
                replaceEachRepeatedly("bcacab", new String[]{"a", "b", "c"}, new String[]{"b", "c", "d"}));
    }

    /**
     * 字符串覆盖
     * 如果start和end索引最小值大于当前字符串的长度,则默认覆盖字符串当前长度的位置
     * 如果start和end索引最大值小于当前字符串的长度,则默认插入到字符串的0位置
     */
    @Test
    public void testOverlay() {
        Log.i("将字符串的[start,end)位置使用ovrlay字符串覆盖", StringUtils.overlay("abcdef", "zz", 2, 4));
        Log.i("将字符串的[start,end)位置使用ovrlay字符串覆盖", StringUtils.overlay("abcdef", "zz", 4, 2));
        Log.i("特殊情况1", StringUtils.overlay("abcdef", "zz", -100, 2));
        Log.i("特殊情况2", StringUtils.overlay("abcdef", "zz", -100, -200));
        Log.i("特殊情况3", StringUtils.overlay("abcdef", "zz", 2, 100));
        Log.i("特殊情况4", StringUtils.overlay("abcdef", "zz", 50, 100));
    }

    /**
     * 填充
     */
    @Test
    public void testPad() {
        Log.i("----------左填充----------");
        Log.i("左填充,默认使用空格", leftPad("abc", 5));
        Log.i("左填充,长度满足不进行填充", leftPad("abc", 2));
        Log.i("左填充,指定填充字符", leftPad("abc", 5, "-"));

        Log.i("----------右填充----------");
        Log.i("右填充,默认使用空格", rightPad("abc", 5));
        Log.i("右填充,长度满足不进行填充", rightPad("abc", 2));
        Log.i("右填充,指定填充字符", rightPad("abc", 5, "-"));
    }

    /**
     * 居中
     */
    @Test
    public void testCenter() {
        Log.i("字符串居中,默认使用空格", center("abc", 5));
        Log.i("字符串居中,指定填充字符", center("abc", 5, "-="));
        Log.i("字符串居中,长度不对称", center("abc", 6, "-="));
    }

    /**
     * 重复
     */
    @Test
    public void testRepeat() {
        Log.i("字符重复3次", repeat('a', 3));
        Log.i("字符串重复3次", repeat("abc", 3));
        Log.i("字符串重复0次", repeat("abc", 0));
        Log.i("字符串重复-1次", repeat("abc", -1));

        Log.i("重复字符串时,加入分割符", repeat("abc", ",", 3));
    }

    /**
     * 字符串包裹
     */
    @Test
    public void testWrap() {
        Log.i("字符串包裹,无论如何都包裹", wrap("=abc=", "="));
        Log.i("字符串包裹,如果不存在才会包裹", wrapIfMissing("=abc=", "="));

        Log.i("如果没有suffixes后缀,则添加后缀suffix", appendIfMissing("abc", "~", "-", "="));
        Log.i("如果没有suffixes后缀,则添加后缀suffix", appendIfMissing("abc-", "~", "-", "="));
        Log.i("prependIfMissing", prependIfMissing("abc", "q:", "Q:", "q:"));

        Log.i("解除字符串的包裹", unwrap("==a==", "="));
    }

    /**
     * 反转
     */
    @Test
    public void testReverse() {
        Log.i("字符串反转", reverse("abc"));
        Log.i("使用分割符反转", reverseDelimited("a-a,b,c", ','));
    }

    /**
     * 大小写转换
     */
    @Test
    public void testCase() {
        Log.i("大写转换", upperCase("abc"));
        Log.i("小写转换", lowerCase("ABC"));
        Log.i("大小写反转", swapCase("Abc"));

        Log.i("指定时区,从而指定不同语言的大小写字母", upperCase("abc", Locale.CHINA));

        Log.i("首字母大写", capitalize("abc"));
        Log.i("首字母小写", uncapitalize("ABC"));
    }

    /**
     * 缩短省略
     * 比如一个长度特别长的字符串展示时要使用...的方式展示,最短的省略大小为4,否则会抛IllegalArgumentException
     */
    @Test
    public void testAbbreviate() {
        Log.i("获取字符串缩写", abbreviate("中华人民共和国", 6));
        Log.i("获取字符串缩写", abbreviate("My Home Page", 8));
        Log.i("获取字符串缩写,指定偏移量", abbreviate("我叫李四,今年20岁了,我喜欢很多很多好吃的", 5, 10));
        Log.i("获取字符串缩写,缩略中部,上面都是尾部或者头部,可以指定缩略符号", abbreviateMiddle("我叫李四,今年20岁了,我喜欢很多很多好吃的", "...", 10));
    }

    /**
     * 匹配计数
     */
    @Test
    public void testCount() {
        Log.i("匹配计数,查找a在abcabc中出现的次数", countMatches("abcabc", "a"));
        Log.i("匹配计数,查找a在abcabc中出现的次数", countMatches("abcabc", 'a'));
    }

}

BooleanUtils

CharUtilsDemo

NumberUtilsDemo

ArrayUtilsDemo

DateUtils

  • Calendar: 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

  • TimeZone: 表示时区偏移量。

  • Locale: 表示了特定的地理、政治和文化地区。需要 Locale 来执行其任务的操作称为语言环境敏感的操作,它使用 Locale 为用户量身定制信息。

  • SimpleDateFormat: 主要是用来格式化Date,用过之后就会发现,它其实不完善,对Calendar提供的支持很少.

经历几个项目发现apache提供的第三方扩展类库,org.apache.commons.lang.time包比较好用,可以将程序中时间处理变的简单一点,提高你的开发效率,下面介绍下常用的方法和具体使用。

org.apache.commons.lang.time 包括以下几个类:

  1. DateFormatUtils 【格式化Calendar与Date并依赖于 FastDateFormat】

  2. DateUtils 【围绕Calendar与Date的实用方法】

  3. DurationFormatUtils 【毫秒数格式化Calendar与Date】

  4. FastDateFormat 【线程安全的SimpleDateFormat】

  5. StopWatch 【提供一个方便的定时的API 】

TimeConstant

FastDateFormatDemo

DateFormatUtilsDemo

DateUtilsDemo

ClassPathUtilsDemo

ClassUtilsDemo

RandomUtilsDemo

builder

ToStringBuilderDemo

CompareToBuildDemo

最后更新于

这有帮助吗?