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() 返回匹配所有看不見(jiàn)的字符的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開(kāi)始,在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è)幫助類的源碼我們沒(méi)怎么講。里面實(shí)現(xiàn)其實(shí)不難的。強(qiáng)烈建議大家有時(shí)間的時(shí)候看一去瞧下蜘渣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妓布,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宋梧,更是在濱河造成了極大的恐慌,老刑警劉巖狰挡,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂龄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡加叁,警方通過(guò)查閱死者的電腦和手機(jī)倦沧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)它匕,“玉大人展融,你說(shuō)我怎么就攤上這事≡ゼ恚” “怎么了告希?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烧给。 經(jīng)常有香客問(wèn)我燕偶,道長(zhǎng),這世上最難降的妖魔是什么础嫡? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任指么,我火速辦了婚禮,結(jié)果婚禮上榴鼎,老公的妹妹穿的比我還像新娘伯诬。我一直安慰自己,他們只是感情好巫财,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布盗似。 她就那樣靜靜地躺著,像睡著了一般翁涤。 火紅的嫁衣襯著肌膚如雪桥言。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天葵礼,我揣著相機(jī)與錄音号阿,去河邊找鬼。 笑死鸳粉,一個(gè)胖子當(dāng)著我的面吹牛扔涧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枯夜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弯汰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起湖雹,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咏闪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后摔吏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸽嫂,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年征讲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了据某。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诗箍,死狀恐怖癣籽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滤祖,我是刑警寧澤筷狼,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站氨距,受9級(jí)特大地震影響桑逝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俏让,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一楞遏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧首昔,春花似錦寡喝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赊颠,卻和暖如春格二,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竣蹦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工顶猜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痘括。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓长窄,卻偏偏與公主長(zhǎng)得像滔吠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挠日,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 目前Google Guava在實(shí)際應(yīng)用中非常廣泛疮绷,本篇博客將以博主對(duì)Guava使用的認(rèn)識(shí)以及在項(xiàng)目中的經(jīng)驗(yàn)來(lái)給大家...
    java高并發(fā)閱讀 1,644評(píng)論 0 8
  • 目前Google Guava在實(shí)際應(yīng)用中非常廣泛,本篇博客將以博主對(duì)Guava使用的認(rèn)識(shí)以及在項(xiàng)目中的經(jīng)驗(yàn)來(lái)給大家...
    張豐哲閱讀 15,268評(píng)論 12 184
  • 一:官方教程 網(wǎng)址:http://blog.csdn.net/axi295309066/article/detai...
    漫步_2310閱讀 1,332評(píng)論 0 1
  • 本文是對(duì) Guava 中 Splitter 的學(xué)習(xí)介紹嚣潜。歡迎加入學(xué)習(xí)項(xiàng)目: LearningGuava冬骚。 使用示例...
    天未的博客閱讀 17,763評(píng)論 0 6
  • 如若滄海有淚,豈獨(dú)巫山無(wú)云懂算。只待風(fēng)花雪月落盡唉韭,在泛黃的流年鐫刻美麗的宿緣。今夜犯犁,遠(yuǎn)去了蘭舟,遠(yuǎn)去了芳草女器;不想柳舞酸役,...
    西子岸香閱讀 476評(píng)論 0 7