日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Joiner

Guava Joiner

顧名思義就是將字符串連接起來(lái)

  Joiner joiner = Joiner.on("; ").skipNulls();

  System.out.println(joiner.join("Harry", null, "Ron", "Hermione"));

  //可以傳集合、數(shù)組或多個(gè)參數(shù)
  List<Integer> nums = List.of(1, 2, 3, 4, 5);
  System.out.println(joiner.join(nums));

輸出:

Harry; Ron; Hermione
1; 2; 3; 4; 5

上面代碼中忽略了 null 也可以將 null 替換為其他字符串,比如:

System.out.println(Joiner.on("; ").useForNull("**").join(1,2,3,null));

Joiner 是線(xiàn)程安全的,一般你可以定義一個(gè) static final的常量:

static final Joiner joiner = Joiner.on(","); 

還可以將 map 也 join 起來(lái):

  Joiner.MapJoiner mapJoiner = Joiner.on("; ").withKeyValueSeparator("|");
  Map<String, Integer> testMap = Map.of("a", 1, "b", 2);
  System.out.println(mapJoiner.join(testMap));

輸出:

b|2; a|1

其他 Joiner

JDK 自身也有 String 的 Joiner API:

  String PREFIX = "[";
  String SUFFIX = "]";
  StringJoiner jdkJoiner = new StringJoiner(",");
  StringJoiner jdkJoiner2 = new StringJoiner(
          ",", PREFIX, SUFFIX);

  System.out.println(jdkJoiner2.add("a").add("b").add("c").toString());

可以添加前、后綴,但元素只能一個(gè)一個(gè) add,沒(méi)有 guava 方便 。

如果你是簡(jiǎn)單的 join 需求,使用 JDK8 以后的 API,直接用 Stream 就完了。

  //use JAVA8 stream
  List<String> rgbList = Arrays.asList("Red", "Green", "Blue");
  String commaSeparatedRGB = rgbList.stream()
          .map(color -> color.toString())
          .collect(Collectors.joining(","));

  System.out.println(commaSeparatedRGB);

總結(jié)

簡(jiǎn)單 join 直接 stream 流式一行代碼搞定,特殊點(diǎn)的看看 Guava 的 joiner 支不支持,一般 Guava 的 Joiner 夠用了。再搞不定的自己寫(xiě)個(gè)工具類(lèi)方法吧。

Splitter

JDK 內(nèi)建

JDK 內(nèi)建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丟棄了尾部的分隔符。

System.out.println(Arrays.toString(",a,,b,".split(",")));

//輸出 [, a, , b]

當(dāng)然還有 StringTokenizer 這種更繁瑣的東西:

  String str = "runoob,google,taobao,facebook,zhihu";
  // 以 , 號(hào)為分隔符來(lái)分隔字符串
  StringTokenizer st=new StringTokenizer(str,",");
  while(st.hasMoreTokens()) { 
      System.out.println(st.nextToken());
  }

Guava Splitter

Splitter使用令人放心的、直白的流暢 API 模式對(duì)這些混亂的特性作了完全的掌控。

Iterable<String> split = Splitter.on(',')
                .trimResults()
                .omitEmptyStrings()
                .split("foo,bar,,   qux");

System.out.println(split.toString());

//輸出 [foo, bar, qux]

Splitter 可以被設(shè)置為按照任何 Pattern, char, String, 或者 CharMatcher拆分。

方法 描述 范例 Splitter.on(char) 按單個(gè)字符拆分 Splitter.on(';') Splitter.on(CharMatcher) 按字符匹配器拆分 Splitter.on(CharMatcher.anyOf(";,.")) Splitter.on(String) 按字符串拆分 Splitter.on(",") Splitter.on(Pattern) Splitter.onPattern(String) 按正則表達(dá)式拆分 Splitter.onPattern("r?n") Splitter.fixedLength(int) 按固定長(zhǎng)度拆分;最后一段可能比給定長(zhǎng)度短,但不會(huì)為空。 Splitter.fixedLength(3)

列舉一些 Splitter 的方法

方法 描述 omitEmptyStrings() 從結(jié)果中自動(dòng)忽略空字符串 trimResults() 移除結(jié)果字符串的前導(dǎo)空白和尾部空白 trimResults(CharMatcher) 給定匹配器,移除結(jié)果字符串的前導(dǎo)匹配字符和尾部匹配字符 limit(int) 限制拆分出的字符串?dāng)?shù)量

注意 trimResults(CharMatcher) ,它是把所有前導(dǎo)字符干掉外加尾部能匹配上的字符,舉個(gè)例子:

// 可以看到,前綴都沒(méi)了,尾部與 “_” 匹配上的只有 “c__”,所以干掉了一個(gè) “_”,剩下 “c_”
System.out.println(Splitter.on(',').trimResults(CharMatcher.is('_')).split("_a ,_b_ ,c__").toString());

上面的代碼返回 :[a , b_ , c] ,

同 Joiner 一樣,Splitter實(shí)例也是線(xiàn)程安全的,所以可以定義為 static final

static final  Splitter  splitter = Splitter.on(",").omitEmptyStrings().trimResults();

還可以利用 MapSplitter 把字符串反序列化成 Map,例如:

  @Test
  public void testMapSplitter() {

      String startSring = "Washington D.C=Redskins#New York City=Giants#Philadelphia=Eagles#Dallas=Cowboys";
      Map<String, String> testMap = Maps.newLinkedHashMap();
      testMap.put("Washington D.C", "Redskins");
      testMap.put("New York City", "Giants");
      testMap.put("Philadelphia", "Eagles");
      testMap.put("Dallas", "Cowboys");
      Splitter.MapSplitter mapSplitter = Splitter.on("#").withKeyValueSeparator("=");
      Map<String, String> splitMap = mapSplitter.split(startSring);

      assertEquals(testMap, splitMap);
  }

CharMatcher

Guava 為我們提供了字符匹配器,你可以認(rèn)為一個(gè)CharMatcher實(shí)例代表著某一類(lèi)字符,如數(shù)字或空白字符。CharMatcher 還提供了一系列方法,讓你對(duì)字符進(jìn)行特定類(lèi)型的操作:修剪 [trim]、折疊 [collapse]、移除 [remove]、保留 [retain] 等等。

所以使用 CharMatcher,大致分兩步

  • 第一步:定義 CharMatcher,定義怎樣算“匹配” 到字符
  • 第二步:如何處理匹配到的這些字符

下面我們用一些小例子來(lái)說(shuō)明:

將 " 1 2 3 4 6 9 " 轉(zhuǎn)換成 "1 2 3 4 6 9" 去掉多余的空格,用空格間隔每個(gè)字符

// 我們先定義“空白” 然后折疊連續(xù)的空白并用一個(gè)空格代替,同時(shí)修剪掉首尾的空格
String tmpStr = "  1   2   3 4 6    9   " ;
String result = CharMatcher.whitespace().trimAndCollapseFrom(tmpStr,' ');
System.out.println(result);

獲取 0-6 范圍內(nèi)的數(shù)字字符

String tmpStr = "df67sn18kj9" ;
String result = CharMatcher.inRange('0','6').retainFrom(tmpStr) ;
System.out.println( result);

獲取 d-k 范圍內(nèi)的數(shù)字字符

String tmpStr = "df67sn18kj9" ;
String result = CharMatcher.inRange('d','k').retainFrom(tmpStr) ;
System.out.println( result); 

去掉特殊字符

String input = "H*el.lo,}12";
CharMatcher matcher = CharMatcher.javaLetterOrDigit();
String result = matcher.retainFrom(input);

assertEquals("Hello12", result);

去掉非 ASCII 碼字符

String input = "あ hello?";

String result = CharMatcher.ascii().retainFrom(input);
assertEquals("hello", result);

result = CharMatcher.inRange('0', 'z').retainFrom(input);
assertEquals("hello", result);

過(guò)濾或篩選字符串中的漢字

  //單字節(jié)匹配器(漢字是雙字節(jié)) 不要漢字
  System.out.println("去除雙字節(jié),獲取單字節(jié):" + CharMatcher.singleWidth().retainFrom(matchStr));
  //只留漢字
  System.out.println("去除單字節(jié),獲取雙字節(jié):" + CharMatcher.singleWidth().removeFrom(matchStr));

方法分類(lèi)

看完上面的例子,你可能對(duì) CharMatcher 的方法感興趣了,CharMatcher 一類(lèi)分三類(lèi)

第一類(lèi)是判定型函數(shù),判斷 Charmacher 和入?yún)⒆址钠ヅ潢P(guān)系。

CharMatcher.is('a').matchesAllOf("aaa");//true
CharMatcher.is('a').matchesAnyOf("aba");//true
CharMatcher.is('a').matchesNoneOf("aba");//true

第二類(lèi)是計(jì)數(shù)型函數(shù),查找入?yún)⒆址械谝淮巍⒆詈笠淮纬霈F(xiàn)目標(biāo)字符的位置,或者目標(biāo)字符出現(xiàn)的次數(shù),比如 indexIn,lastIndexIn 和 countIn。

CharMatcher.is('a').countIn("aaa"); // 3
CharMatcher.is('a').indexIn("java"); // 1

第三類(lèi)就是對(duì)匹配字符的操作。包括 removeFrom、retainFrom、replaceFrom、trimFrom、collapseFrom 等。

方法清單

拉個(gè)單子方便查

 

 

 

 

CaseFormat

CaseFormat 被用來(lái)方便地在各種 ASCII 大小寫(xiě)規(guī)范間轉(zhuǎn)換字符串——比如,編程語(yǔ)言的命名規(guī)范。CaseFormat 支持的格式如下:

格式 范例 LOWER_CAMEL lowerCamel LOWER_HYPHEN lower-hyphen LOWER_UNDERSCORE lower_underscore UPPER_CAMEL UpperCamel UPPER_UNDERSCORE UPPER_UNDERSCORE

CaseFormat 的用法很直接:

CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME")); // returns "constantName"

CaseFormat 在某些時(shí)候尤其有用,比如編寫(xiě)代碼生成器的時(shí)候。

Strings

Strings 工具類(lèi)也提供了許多好用的處理字符串的方法,比如簡(jiǎn)單和見(jiàn)名知義就不多說(shuō)了。

參考

  • https://www.runoob.com/w3cnote/java-stringtokenizer-intro.html
  • https://www.baeldung.com/guava-string-charmatcher
  • https://github.com/google/guava/wiki/StringsExplained#splitter
  • https://mindawei.github.io/2018/03/17/Guava 學(xué)習(xí)之 CharMatcher/

分享到:
標(biāo)簽:Java
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定