Guava 字符串使用總結


背景

  目前Google Guava在實際應用中非常廣泛,本篇是我對 Guava 使用的認識以及在項目中的經驗來給大家分享!

  學習使用Google Guava可以讓你快樂編程,寫出優雅的JAVA代碼!

  以面向對象思想處理字符串:Joiner/Splitter/CharMatcher

問題

  有朋友就要問了,jdk 提供的 String 還不夠好嗎?

  也許還不夠友好,至少讓我們用起來還不夠爽,還得操心!

  舉個栗子,比如String提供的split方法,我們得關心空字符串吧,還得考慮返回的結果中存在null元素吧,只提供了前后trim的方法(如果我想對中間元素進行trim呢)。

  guava 使用起來就不需要考慮這么多,好,那我們開始進入正式主題。

Joiner/Splitter

  Joiner是連接器,Splitter是分割器,通常我們會把它們定義為 static final,利用 on 生成對象后,在應用到 String 進行處理,這是可以復用的。

  要知道 apache commons StringUtils 提供的都是 static method。

  更加重要的是,guava提供的 Joiner/Splitter 是經過充分測試,它的穩定性和效率要比apache高出不少,這個你可以自行測試下~發現沒有我們想對String做什么操作,就是生成自己定制化的 Joiner/Splitter,多么直白,簡單,流暢的API!

  對於Joiner,常用的方法是 跳過NULL元素:skipNulls() ;

  對於NULL元素使用其他替代:useForNull(String)。

  對於Splitter,常用的方法是:trimResults() / omitEmptyStrings()。

  注意拆分的方式,有字符串,還有正則,還有固定長度分割(太貼心了!)

Joiner 應用案例

將集合按指定字符拼接成字符串

private final List<String> stringList = Arrays.asList(
        "tom","jack","bob");

private final List<String> stringListWithNullValue = Arrays.asList(
        "tom","jack","bob",null,"rose");

@Test
public void testJoin(){
    String join = Joiner.on("#").join(stringList);
    assertThat(join,equalTo("tom#jack#bob"));
}

// 跳過list中的null
@Test
public void testJoinOnJoinSkipNull(){
    String join = Joiner.on("#").skipNulls().join(stringListWithNullValue);
    assertThat(join,equalTo("tom#jack#bob#rose"));
}

// 替換null為指定字符
@Test
public void testJoinOnJoinUseForNull(){
    String join = Joiner.on("#").useForNull("NULL").join(stringListWithNullValue);
    assertThat(join,equalTo("tom#jack#bob#NULL#rose"));
}

// appendTo
@Test
public void testJoinOnJoinAppendTo(){
    final StringBuilder buffer = new StringBuilder("TEST");
    StringBuilder buffer_new = Joiner.on("#").appendTo(buffer, stringList);
    assertThat(buffer_new.toString(),equalTo("TESTtom#jack#bob"));
}

private final Map<String,String> stringMap = ImmutableMap.of("a","b","c","d");

/**
 * 對Map kv拆分
 */
@Test
public void testJoinOnWithMap(){
    assertThat(Joiner.on("#").withKeyValueSeparator("=").join(stringMap),equalTo("a=b#c=d"));
}
Joiner示例

Splitter 應用案例

Splitter主要是分隔字符串為List或Map

@Test
public void testSplitter(){
    List<String> stringList = Splitter.on("|").splitToList("hello|word");
    assertThat(stringList,notNullValue());
    assertThat(stringList.size(),equalTo(2));
}

@Test
public void testSplitter_OmitEmpty(){
    List<String> stringList = Splitter.on("|").omitEmptyStrings().splitToList("hello|word||||");
    assertThat(stringList,notNullValue());
    assertThat(stringList.size(),equalTo(2));
}

@Test
public void testSplitter_TrimResult(){
    List<String> stringList = Splitter.on("|").trimResults().omitEmptyStrings().splitToList(" hello | word||||");
    assertThat(stringList,notNullValue());
    assertThat(stringList.size(),equalTo(2));
}

@Test
public void testSplitter_FixLeng(){
    List<String> result = Splitter.fixedLength(4).splitToList("aaaabbbbccccdddd");
    assertThat(result,notNullValue());
    assertThat(result.size(),equalTo(4));
    assertThat(result.get(0),equalTo("aaaa"));
}

@Test
public void testSplitter_Limit(){
    List<String> result = Splitter.on("#").limit(3).splitToList("aaaa#bbbb#cccc#dddd");
    assertThat(result,notNullValue());
    assertThat(result.size(),equalTo(3));
    assertThat(result.get(2),equalTo("cccc#dddd"));
}

// 轉Map
@Test
public void testSplitter_SplitToMap(){
    Map<String, String> split = Splitter.on("|").withKeyValueSeparator("=").split("a=b|c=d");
    assertThat(split,notNullValue());
    assertThat(split.size(),equalTo(2));
    assertThat(split.get("a"),equalTo("b"));
}
Splitter示例

CharMatcher

  CharMatcher,將字符的匹配和處理解耦,並提供豐富的方法供你使用!

  對基本類型進行支持

  guava對JDK提供的原生類型操作進行了擴展,使得功能更加強大!那我們直接上代碼吧

//1.判定型函數,判斷 CharMacher 和入參字符串的匹配關系。
System.out.println(CharMatcher.is('a').matchesAllOf("aaa")); //true
System.out.println(CharMatcher.is('a').matchesAnyOf("aba")); //true
System.out.println(CharMatcher.is('a').matchesNoneOf("aba"));//false
//2.計數型函數,查找入參字符串中第一次、最后一次出現目標字符的位置,或者目標字符出現的次數
System.out.println(CharMatcher.is('a').countIn("aba"));//2
System.out.println(CharMatcher.is('a').indexIn("aba"));//0
//3.對匹配字符的操作。包括 removeFrom、retainFrom、replaceFrom、trimFrom、collapseFrom 等
System.out.println(CharMatcher.is('a').retainFrom("bazaar"));//aaa
System.out.println(CharMatcher.is('a').removeFrom("bazaar"));//bzr
System.out.println(CharMatcher.anyOf("ab").removeFrom("abacatbab"));//ct

  還有一些常用的常量使用來處理字符串內容,具體實際案例如下:

String str = " ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好\t234啊   GES ";
/**
 * 1. 原字符串
 *  ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好   234啊   GES
 */
System.out.println(str);
/**
 * 2. 去掉控制字符(\t,\n,\b...)
 *  ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS   你好234啊   GES
 */
System.out.println(CharMatcher.javaIsoControl().removeFrom(str));
/**
 * 3. 獲取所有的數字
 * 23234
 */
System.out.println(CharMatcher.digit().retainFrom(str));
/**
 * 4. 把多個空格替換為一個包括\t,並去掉首位的空格
 * ROCKY rocky RoCkY ~!@#$%^&*() 23(*&gS 你好 234啊 GES
 */
System.out.println(CharMatcher.whitespace().trimAndCollapseFrom(str, ' '));
/**
 * 5. 把所有的數字用"*"代替
 *  ROCKY  rocky  RoCkY ~!@#$%^&*()      **(*&gS   你好   ***啊   GES 
 */
System.out.println(CharMatcher.javaDigit().replaceFrom(str, "*"));
/**
 * 6. 獲取所有的數字和小寫字母
 * rockyok23g234
 */
System.out.println(CharMatcher.javaDigit().or(CharMatcher.javaLowerCase()).retainFrom(str));
/**
 * 7. 獲取所有的大寫字母
 * ROCKYRCYSGES
 */
System.out.println(CharMatcher.javaUpperCase().retainFrom(str));
/**
 * 8. 獲取所有單字節長度的符號
 * ROCKY  rocky  RoCkY ~!@#$%^&*()      23(*&gS         234   GES 
 */
System.out.println(CharMatcher.singleWidth().retainFrom(str));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM