天天看點

apache commons StringUtils介紹apache commons StringUtils介紹

apache commons StringUtils介紹

熱4 已有 1529 次閱讀  2012-05-06 21:27  标簽:  apache  apache commons StringUtils介紹

org.apache.commons.lang.StringUtils

StringUtils是apache commons lang庫( http://commons.apache.org/lang)旗下的一個工具類,提供了很多有用的處理字元串的方法,本文不打算把所有的方法都介紹一遍,我會介紹一些精選的常用的給大家。

目前StringUtils有兩個版本可用,分别是較新的org.apache.commons.lang3.StringUtils和較老的org.apache.commons.lang.StringUtils,他們有比較大的差別,前者需要JAVA 5,我想這個應該是我們希望使用的。

1)public static boolean equals(CharSequence str1,CharSequence str2)

我們就先從最簡單的方法equals開始,和你想的一樣,他需要兩個字元串參數,當相同的時候傳回true,否則傳回false。

但是java.lang.String已經有現成的比較完美的equals方法了,為何我們還需要一個第三方的實作呢?

這個問題很好,讓我們來看看下面這些代碼,看看有何問題?

Java代碼 

  1. public void doStuffWithString(String stringParam) {    
  2. if(stringParam.equals("MyStringValue")) {    
  3. // do stuff }    
  4. }   

源代碼 複制 列印

  1. public void doStuffWithString(String stringParam) {   
  2. if(stringParam.equals("MyStringValue")) {   
  3. // do stuff }   
  4. }   

這個可能有NullPointerException出現,那麼有幾個辦法處理:

Java代碼 

  1. public void safeDoStuffWithString1(String stringParam) {    
  2. if(stringParam != null &&    
  3. stringParam.equals("MyStringValue")) {    
  4. // do stuff    
  5. }    
  6. }     
  7. public void safeDoStuffWithString2(String stringParm) {    
  8. if("MyStringValue".equals(stringParam))    
  9. {    
  10. // do stuff    
  11. }    
  12. }   

源代碼 複制 列印

  1. public void safeDoStuffWithString1(String stringParam) {   
  2. if(stringParam != null &&   
  3. stringParam.equals("MyStringValue")) {   
  4. // do stuff   
  5. }   
  6. }    
  7. public void safeDoStuffWithString2(String stringParm) {   
  8. if("MyStringValue".equals(stringParam))   
  9. {   
  10. // do stuff   
  11. }   
  12. }   

我本人不喜歡上面的兩個方法,第一個看起來太臃腫,第二個看起來像錯誤的。這裡我們就可以用一些StringUtils類了,這個類提供的equals方法是空指針安全的,不用擔心傳遞給他的是什麼參數,他不會抛出空指針異常,這樣寫:

Java代碼 

  1. public void safeDoStuffWithString3(String stringParam) {   
  2. if(StringUtils.equals(stringParam,"MyStringValue))    
  3. {    
  4. // do stuff    
  5. }    
  6. }   

源代碼 複制 列印

  1. public void safeDoStuffWithString3(String stringParam) {  
  2. if(StringUtils.equals(stringParam,"MyStringValue))   
  3. {   
  4. // do stuff   
  5. }   
  6. }   

這個是我個人的喜好,但是這個确實看起來比較簡單易讀。前面的兩個方法雖然麼有什麼問題,但是我想StringUtils.equals還是值得考慮的。

2)isEmpty,isNotEmpty,isBlank,isNotBlank

和前面一樣,這些方法相對于jdk提供的isEmpty方法來說,多了一個“空指針安全”,即不用考慮傳遞參數的空值問題,讓我們來看一個例子:

Java代碼 

  1. if(myString != null && !myString.isEmpty()) {    
  2. // 有點臃腫是把?   
  3. // Do stuff with myString    
  4. }    
  5. if(StringUtils.isNotEmpty(myString)) { // 好多了吧    
  6. // Do stuff with myString    
  7. }   

源代碼 複制 列印

  1. if(myString != null && !myString.isEmpty()) {   
  2. // 有點臃腫是把?  
  3. // Do stuff with myString   
  4. }   
  5. if(StringUtils.isNotEmpty(myString)) { // 好多了吧   
  6. // Do stuff with myString   
  7. }   

Blank和empty的差別

isBlank将在字元串含有空白字元的時候,傳回true,例如:

Java代碼 

  1. String someWhiteSpace = " \t \n";    
  2. StringUtils.isEmpty(someWhiteSpace); // false    
  3. StringUtils.isBlank(someWhiteSpace); // true   

源代碼 複制 列印

  1. String someWhiteSpace = " \t \n";   
  2. StringUtils.isEmpty(someWhiteSpace); // false   
  3. StringUtils.isBlank(someWhiteSpace); // true   

3)public static String[] split(String str,String separatorChars)

當然,這個方法相對于String.split也是空指針安全的,當你嘗試split一個null字元串的時候,将傳回Null,一個Null的分隔符将按照空白字元分隔字元串,但是,還有一個理由讓你可考慮使用StringUtils.split()方法,就是jdk自帶的String.split由于支援正規表達式進行分隔,是以可能帶來意想不到的後果,例如:

Java代碼 

  1. public void possiblyNotWhatYouWant() {   
  2. String contrivedExampleString = "one.two.three.four";    
  3. String[] result = contrivedExampleString.split(".");    
  4. System.out.println(result.length); // 0    
  5. }  

源代碼 複制 列印

  1. public void possiblyNotWhatYouWant() {  
  2. String contrivedExampleString = "one.two.three.four";   
  3. String[] result = contrivedExampleString.split(".");   
  4. System.out.println(result.length); // 0   
  5. }  

上面很明顯你希望按照.分隔,但是jdk了解的“.”是正規表達式的任意字元,導緻字元串内任意字元都比對,傳回一個size=0的字元串數組。其實你隻要傳遞"\\."就行了,但是這個确實是一個問題。 

這樣,使用StringUtils.split就簡單多了,另外,我測試還發現StringUtils.split比jdk自帶的split要快四倍。

4)public static String join(Iterable iterable,String separator)

這個方法确實很實用,因為jdk自身沒有提供,簡單使用方法:

Java代碼 

  1. String[] numbers = {"one", "two", "three"};   
  2. StringUtils.join(numbers,","); // returns "one,two,three"   

源代碼 複制 列印

  1. String[] numbers = {"one", "two", "three"};  
  2. StringUtils.join(numbers,","); // returns "one,two,three"   

當然你可以傳遞一個數字或者疊代序列iterators.

好了,我确信,這個庫确實是一個比較實用的庫,推薦大家使用。

API請參考: http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringUtils.html