Google Guava 字符串處理

? ? ? ?為了方便我們對(duì)字符串的處理,Guava給我們提供了好多很方便的工具類,接下來(lái)我們對(duì)Guava里面字符串相關(guān)的幫助類做一個(gè)簡(jiǎn)單的介紹。

一 連接器 -- Joiner

? ? ? ?Joiner用于幫助我們把多個(gè)字符串通過(guò)連接符連接起來(lái)。Joiner里面也提供和很多很有用的方法,比如null提花,跳過(guò)null值等等。而且還派生了MapJoiner類用于連接多個(gè)Map,可以同時(shí)制定Map之間的連接符和key value之間的連接符。

1.1 Joiner方法介紹

public class Joiner {

    /**
     * 創(chuàng)建連接器 Joiner
     * @param separator 連接符
     */
    public static Joiner on(String separator);

    /**
     * 創(chuàng)建連接器 Joiner
     * @param separator 連接符
     */
    public static Joiner on(char separator);


    /**
     * 相當(dāng)于parts中間添加appendable
     * StringBuffer也是一個(gè)Appendable
     */
    @CanIgnoreReturnValue
    public <A extends Appendable> A appendTo(A appendable, Iterable<?> parts) throws IOException;

    /**
     * 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
     * StringBuffer也是一個(gè)Appendable
     */
    @CanIgnoreReturnValue
    public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException;

    /**
     * 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
     * StringBuffer也是一個(gè)Appendable
     */
    @CanIgnoreReturnValue
    public final <A extends Appendable> A appendTo(A appendable, Object[] parts) throws IOException;

    /**
     * 把元素轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
     */
    @CanIgnoreReturnValue
    public final <A extends Appendable> A appendTo(
        A appendable, @Nullable Object first, @Nullable Object second, Object... rest)
        throws IOException;

    /**
     * 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
     */
    @CanIgnoreReturnValue
    public final StringBuilder appendTo(StringBuilder builder, Iterable<?> parts);

    /**
     * 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
     */
    @CanIgnoreReturnValue
    public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts);

    /**
     * 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
     */
    @CanIgnoreReturnValue
    public final StringBuilder appendTo(StringBuilder builder, Object[] parts);

    /**
     * 相當(dāng)于每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
     */
    @CanIgnoreReturnValue
    public final StringBuilder appendTo(
        StringBuilder builder, @Nullable Object first, @Nullable Object second, Object... rest);

    /**
     * 把parts每個(gè)元素轉(zhuǎn)換為字符串,再添加連接符之后返回
     */
    public final String join(Iterable<?> parts);

    /**
     * 把parts每個(gè)元素轉(zhuǎn)換為字符串,再添加連接符之后返回
     */
    public final String join(Iterator<?> parts);

    /**
     * 把parts每個(gè)元素轉(zhuǎn)換為字符串,再添加連接符之后返回
     */
    public final String join(Object[] parts);

    /**
     * 給參數(shù)里面的每個(gè)元素轉(zhuǎn)換為String,再添加連接符之后返回
     */
    public final String join(@Nullable Object first, @Nullable Object second, Object... rest);

    /**
     * 用指定的字符串替換掉null對(duì)象
     */
    public Joiner useForNull(final String nullText);
    

    /**
     * 連接Map的Joiner 設(shè)置key, value之間的分隔符
     */
    public MapJoiner withKeyValueSeparator(char keyValueSeparator);

    /**
     * 連接Map的Joiner 設(shè)置key, value之間的分隔符
     */
    public MapJoiner withKeyValueSeparator(String keyValueSeparator);

}

1.2 Joiner使用實(shí)例

    @Test
    public void joinTest() {
        List<String> stringSrc = Lists.newArrayList("C", "Android", "Java");
        String resultString  = Joiner.on("; ")
                                     .join(stringSrc);
        System.out.println(resultString);
    }

    /**
     * useForNull 用指定的值來(lái)替換null
     */
    @Test
    public void useForNullTest() {
        String resultString = Joiner.on("; ")
                                    .useForNull("abc")
                                    .join("C", null, "Android", "Java");
        System.out.println(resultString);
    }

    /**
     * skipNulls 跳過(guò)null
     */
    @Test
    public void skipNullsTest() {
        String resultString = Joiner.on("; ")
                                    .skipNulls()
                                    .join("C", null, "Android", "Java");
        System.out.println(resultString);
    }

    /**
     * withKeyValueSeparator
     */
    @Test
    public void withKeyValueSeparatorTest() {
        Map<String, String> mapSrc = new HashMap<>();
        mapSrc.put("key0", "value0");
        mapSrc.put("key1", "value1");
        String resultString = Joiner.on("; ")
                                    .withKeyValueSeparator("&")
                                    .join(mapSrc);
        System.out.println(resultString);
    }

二 拆分器 -- Splitter

? ? ? ?Splitter可以幫助我們制定拆分符對(duì)字符串進(jìn)行拆分。里面也提供了很多使用的方法,比如去掉空格,限制拆分出來(lái)的字符串的個(gè)數(shù)等等。同時(shí)還提供了MapSplitter派生類用來(lái)把指定格式的字符串拆分到Map里面去。

2.1 Splitter方法介紹

public class Splitter {

    /**
     * 指定按單個(gè)字符拆分
     */
    public static Splitter on(char separator);

    /**
     * 指定按字符匹配器拆分
     */
    public static Splitter on(final CharMatcher separatorMatcher);

    /**
     * 指定按字符串拆分
     */
    public static Splitter on(final String separator);

    /**
     * 指定按正則表達(dá)式拆分
     */
    @GwtIncompatible // java.util.regex
    public static Splitter on(Pattern separatorPattern);

    /**
     * 指定按正則表達(dá)式拆分
     */
    @GwtIncompatible // java.util.regex
    public static Splitter onPattern(String separatorPattern);

    /**
     * 創(chuàng)建Splitter對(duì)象, 按固定長(zhǎng)度拆分;最后一段可能比給定長(zhǎng)度短,但不會(huì)為空
     */
    public static Splitter fixedLength(final int length);

    /**
     * 從結(jié)果中自動(dòng)忽略空字符串
     */
    public Splitter omitEmptyStrings();

    /**
     * 限制拆分出的字符串?dāng)?shù)量
     */
    public Splitter limit(int limit) {
        checkArgument(limit > 0, "must be greater than zero: %s", limit);
        return new Splitter(strategy, omitEmptyStrings, trimmer, limit);
    }

    /**
     * 移除結(jié)果字符串的前導(dǎo)空白和尾部空白
     */
    public Splitter trimResults() {
        return trimResults(CharMatcher.whitespace());
    }

    /**
     * 給定匹配器,移除結(jié)果字符串的前導(dǎo)匹配字符和尾部匹配字符
     */
    // TODO(kevinb): throw if a trimmer was already specified!
    public Splitter trimResults(CharMatcher trimmer);

    /**
     * 按照趙鼎的拆分條件拆分, 返回Iterable<String>
     */
    public Iterable<String> split(final CharSequence sequence);

    /**
     * 按照指定的條件拆分,返回List<String>
     */
    public List<String> splitToList(CharSequence sequence);

    /**
     * 返回MapSplitter并且指定key,value之間的拆分字符串
     */
    @Beta
    public MapSplitter withKeyValueSeparator(String separator);

    /**
     * 返回MapSplitter并且指定key,value之間的拆分字符串
     */
    @Beta
    public MapSplitter withKeyValueSeparator(char separator);

    /**
     * 返回MapSplitter并且指定key,value之間的拆分規(guī)則為Splitter
     */
    @Beta
    public MapSplitter withKeyValueSeparator(Splitter keyValueSplitter);


2.2 Splitter使用實(shí)例

    @Test
    public void splitTest() {
        Iterable<String> iterableList = Splitter.on(',').trimResults() // 移除前面和后面的空白
                                                .omitEmptyStrings() // 去掉null
                                                .split("foo,bar,,   qux");
        List<String> resultList = Lists.newArrayList(iterableList);
        for (String item : resultList) {
            System.out.println(item);
        }
    }

    /**
     * splitToList 最終直接返回List
     */
    @Test
    public void splitToListTest() {
        List<String> resultList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList("foo,bar,,   qux");
        for (String item : resultList) {
            System.out.println(item);
        }
    }

    /**
     * MapSplitter
     */
    @Test
    public void mapSplitterTest() {
        String source = "key0:value0#key1:value1";
        Map<String, String> resultMap = Splitter.on("#").withKeyValueSeparator(":").split(source);
        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println("key: " + entry.getKey() + " value: " + entry.getValue());
        }
    }

三 字符匹配器 -- CharMatcher

? ? ? ?CharMatcher是字符匹配的一個(gè)幫助類,CharMatcher主要圍繞兩件事情來(lái)進(jìn)行:找到匹配的字符、處理匹配的字符。

3.1 CharMatcher方法介紹

CharMatcher創(chuàng)建的static方法 解釋 備注
CharMatcher any() 返回匹配任何字符的Matcher
CharMatcher none() 返回不匹配所有字符的Matcher
CharMatcher whitespace() 返回匹配所有空白字符的Matcher
CharMatcher breakingWhitespace() 返回匹配所有可換行的空白字符(不包括非換行空白字符,例如"\u00a0")的Matcher
CharMatcher ascii() 返回匹配是否是ASCII字符的Matcher
CharMatcher digit() 返回匹配ASCII數(shù)字的Matcher 不推薦使用了,使用inRange('0', '9')替換
CharMatcher javaDigit() 返回匹配UNICODE數(shù)字的Matcher 不推薦使用了,使用inRange('0', '9')替換實(shí)現(xiàn)
CharMatcher javaLetter() 返回匹配字母的Matcher 不推薦使用了,使用 inRange('a', 'z').or(inRange('A', 'Z') 替換
CharMatcher javaLetterOrDigit() 返回匹配數(shù)字或字母的Matcher 不推薦使用了,使用isLetterOrDigit替換
CharMatcher javaUpperCase() 返回匹配大寫的Matcher 不推薦使用了,使用isUpperCase()替換
CharMatcher javaLowerCase() 返回匹配小寫的Matcher 不推薦使用了,使用isLowerCase()替換
CharMatcher javaIsoControl() 返回匹配ISO控制字符的Matcher, 使用 Charater.isISOControl() 實(shí)現(xiàn) 也可以使用isISOControl()實(shí)現(xiàn)
CharMatcher invisible() 返回匹配所有看不見的字符的Matcher 不推薦使用了
CharMatcher singleWidth() 返回匹配單字寬字符的Matcher,如中文字就是雙字寬 不推薦使用了
CharMatcher is(char match) 返回匹配指定字符的Matcher
CharMatcher isNot(char match) 返回不匹配指定字符的Matcher
CharMatcher anyOf(CharSequence sequence) 返回匹配sequence中任意字符的Matcher
CharMatcher noneOf(CharSequence sequence) 返回不匹配sequence中任何一個(gè)字符的Matcher
CharMatcher inRange(char startInclusive, char endIncludesive) 返回匹配范圍內(nèi)任意字符的Matcher
CharMatcher forPredicate(Predicate<? super Charater> predicate) 返回使用predicate的apply()判斷匹配的Matcher
CharMatcher negate() 返回以當(dāng)前Matcher判斷規(guī)則相反的Matcher
CharMatcher and(CharMatcher other) 返回與other匹配條件組合做與來(lái)判斷的Matcher
CharMatcher or(CharMatcher other) 返回與other匹配條件組合做或來(lái)判斷的Matcher
CharMatcher常用方法 解釋
boolean matchesAnyOf(CharSequence sequence) 只要sequence中有任意字符能匹配Matcher,返回true
boolean matchesAllOf(CharSequence sequence) sequence中所有字符都能匹配Matcher,返回true
boolean matchesNoneOf(CharSequence sequence) sequence中所有字符都不能匹配Matcher,返回true
int indexIn(CharSequence sequence) 返回sequence中匹配到的第一個(gè)字符的坐標(biāo)
int indexIn(CharSequence sequence, int start) 返回從start開始,在sequence中匹配到的第一個(gè)字符的坐標(biāo)
int lastIndexIn(CharSequence sequence) 返回sequence中最后一次匹配到的字符的坐標(biāo)
int countIn(CharSequence sequence) 返回sequence中匹配到的字符計(jì)數(shù)
String removeFrom(CharSequence sequence) 刪除sequence中匹配到到的字符并返回
String retainFrom(CharSequence sequence) 保留sequence中匹配到的字符并返回
String replaceFrom(CharSequence sequence, char replacement) 替換sequence中匹配到的字符并返回
String trimFrom(CharSequence sequence) 刪除首尾匹配到的字符并返回
String trimLeadingFrom(CharSequence sequence) 刪除首部匹配到的字符
String trimTrailingFrom(CharSequence sequence) 刪除尾部匹配到的字符
String collapseFrom(CharSequence sequence, char replacement) 將匹配到的組(連續(xù)匹配的字符)替換成replacement
String trimAndCollapseFrom(CharSequence sequence, char replacement) 先trim在replace

3.2 CharMatcher使用實(shí)例

? ? ? ?針對(duì)CharMatcher的使用,我們舉幾個(gè)簡(jiǎn)單的例子。

    @Test
    public void matcherNumCharTest() {
        // 創(chuàng)建一個(gè)匹配數(shù)字字符的CharMatcher
        CharMatcher numMatcher = CharMatcher.inRange('0', '9');
        // 匹配判斷(false)
        System.out.println(numMatcher.matches('a'));
    }


    @Test
    public void retainFromTest() {
        // 創(chuàng)建一個(gè)匹配數(shù)字字符的CharMatcher
        CharMatcher numMatcher = CharMatcher.inRange('0', '9');
        // retainFrom保留匹配到的字符(123789)
        System.out.println(numMatcher.retainFrom("123abc789"));
    }

    @Test
    public void countInTest() {
        // 創(chuàng)建匹配任何字符的Matcher
        CharMatcher numMatcher = CharMatcher.any();
        // 返回sequence中匹配到的字符個(gè)數(shù)(9個(gè))
        int matcherCount = numMatcher.countIn("abc123abc");
        System.out.println("匹配到的字符個(gè)數(shù):" + matcherCount);
    }

    @Test
    public void negateTest() {
        // 創(chuàng)建了一個(gè)匹配字母的Matcher
        CharMatcher letterMatcher = CharMatcher.inRange('a', 'z')
                                            .or(CharMatcher.inRange('A', 'Z'));
        // 非字母的Matcher negate()規(guī)則相反
        CharMatcher notLetterMatcher = letterMatcher.negate();
        System.out.println(notLetterMatcher.retainFrom("abcABC123"));
    }

    @Test
    public void indexInTest() {

        // 創(chuàng)建了一個(gè)只匹配a字母的Matcher
        CharMatcher letterMatcher = CharMatcher.is('a');
        // 非字母的Matcher negate()規(guī)則相反
        int aStartIndex = letterMatcher.indexIn("123abcabc");
        int aEndIndex = letterMatcher.lastIndexIn("123abcabc");
        System.out.println("a第一次出現(xiàn)的位置:" + aStartIndex);
        System.out.println("a最后一次出現(xiàn)的位置:" + aEndIndex);
    }

四 字符集 -- Charsets

? ? ? ?guava里面的Charsets可以完全使用StandardCharsets來(lái)代替。所以我們干脆直接介紹StandardCharsets了,StandardCharsets比較是JDK里面的東西。StandardCharsets是用來(lái)做字符集處理。比如我們String和byte數(shù)組之間相互轉(zhuǎn)換的時(shí)候可以使用到。

        String src = "abc";
        byte[] byteDis src.getBytes(StandardCharsets.UTF_8);

? ? ? ?StandardCharsets里面的代碼也很簡(jiǎn)答。

public final class StandardCharsets {

    private StandardCharsets() {
        throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
    }
    /**
     * Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
     * Unicode character set
     */
    public static final Charset US_ASCII = Charset.forName("US-ASCII");
    /**
     * ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
     */
    public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
    /**
     * Eight-bit UCS Transformation Format
     */
    public static final Charset UTF_8 = Charset.forName("UTF-8");
    /**
     * Sixteen-bit UCS Transformation Format, big-endian byte order
     */
    public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
    /**
     * Sixteen-bit UCS Transformation Format, little-endian byte order
     */
    public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
    /**
     * Sixteen-bit UCS Transformation Format, byte order identified by an
     * optional byte-order mark
     */
    public static final Charset UTF_16 = Charset.forName("UTF-16");
}

五 CaseFormat

? ? ? ?CaseFormat是一個(gè)枚舉,他也是一種字符轉(zhuǎn)換實(shí)用工具類,以提供不同的ASCII字符格式之間的轉(zhuǎn)換。比如我們想把lower-hyphen字符轉(zhuǎn)換成lowerCamel,小駝峰大駝峰之間的轉(zhuǎn)換等等。

CaseFormat枚舉 對(duì)應(yīng)字符串格式 解釋
LOWER_HYPHEN lower-hyphen 全部小寫—連接
LOWER_UNDERSCORE lower_underscore 全部小寫下劃線連接
LOWER_CAMEL lowerCamel 小駝峰
UPPER_CAMEL UpperCamel 大駝峰
UPPER_UNDERSCORE UPPER_UNDERSCORE 全部大寫下劃線連接

? ? ? ?CaseFormat類的用法也很簡(jiǎn)單。里面就一個(gè)方法,public final String to(CaseFormat format, String str) 用于把一種CaseFormat類型對(duì)應(yīng)的字符串轉(zhuǎn)換成另一種CaseFormat對(duì)應(yīng)的字符串。

? ? ? ?舉一個(gè)非常簡(jiǎn)單的例子。把字符串“CONSTANT_NAME”轉(zhuǎn)換為小駝峰形式“constantName”。 代碼如下

    @Test
    public void test() {
        // 把字符串“CONSTANT_NAME”轉(zhuǎn)換成"constantName"
        String resultToStr = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME");
        System.out.println(resultToStr);
    }

? ? ? ?這里關(guān)于Guava字符串處理者幾個(gè)幫助類的源碼我們沒怎么講。里面實(shí)現(xiàn)其實(shí)不難的。強(qiáng)烈建議大家有時(shí)間的時(shí)候看一去瞧下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目前Google Guava在實(shí)際應(yīng)用中非常廣泛,本篇博客將以博主對(duì)Guava使用的認(rèn)識(shí)以及在項(xiàng)目中的經(jīng)驗(yàn)來(lái)給大家...
    java高并發(fā)閱讀 1,705評(píng)論 0 8
  • 目前Google Guava在實(shí)際應(yīng)用中非常廣泛,本篇博客將以博主對(duì)Guava使用的認(rèn)識(shí)以及在項(xiàng)目中的經(jīng)驗(yàn)來(lái)給大家...
    張豐哲閱讀 15,594評(píng)論 12 184
  • 一:官方教程 網(wǎng)址:http://blog.csdn.net/axi295309066/article/detai...
    漫步_2310閱讀 1,486評(píng)論 0 1
  • 本文是對(duì) Guava 中 Splitter 的學(xué)習(xí)介紹。歡迎加入學(xué)習(xí)項(xiàng)目: LearningGuava。 使用示例...
    天未的博客閱讀 18,118評(píng)論 0 6
  • 老廖不看劇很久很久很久了,甚至現(xiàn)實(shí)世界的東西我也了解得不多,直到我遇到了你們——秀英語(yǔ)的成年學(xué)員們。 一把讓老廖進(jìn)...
    9444e0643fbd閱讀 337評(píng)論 2 6

友情鏈接更多精彩內(nèi)容