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代碼
- public void doStuffWithString(String stringParam) {
- if(stringParam.equals("MyStringValue")) {
- // do stuff }
- }
源代碼 複制 列印
- public void doStuffWithString(String stringParam) {
- if(stringParam.equals("MyStringValue")) {
- // do stuff }
- }
這個可能有NullPointerException出現,那麼有幾個辦法處理:
Java代碼
- public void safeDoStuffWithString1(String stringParam) {
- if(stringParam != null &&
- stringParam.equals("MyStringValue")) {
- // do stuff
- }
- }
- public void safeDoStuffWithString2(String stringParm) {
- if("MyStringValue".equals(stringParam))
- {
- // do stuff
- }
- }
源代碼 複制 列印
- public void safeDoStuffWithString1(String stringParam) {
- if(stringParam != null &&
- stringParam.equals("MyStringValue")) {
- // do stuff
- }
- }
- public void safeDoStuffWithString2(String stringParm) {
- if("MyStringValue".equals(stringParam))
- {
- // do stuff
- }
- }
我本人不喜歡上面的兩個方法,第一個看起來太臃腫,第二個看起來像錯誤的。這裡我們就可以用一些StringUtils類了,這個類提供的equals方法是空指針安全的,不用擔心傳遞給他的是什麼參數,他不會抛出空指針異常,這樣寫:
Java代碼
- public void safeDoStuffWithString3(String stringParam) {
- if(StringUtils.equals(stringParam,"MyStringValue))
- {
- // do stuff
- }
- }
源代碼 複制 列印
- public void safeDoStuffWithString3(String stringParam) {
- if(StringUtils.equals(stringParam,"MyStringValue))
- {
- // do stuff
- }
- }
這個是我個人的喜好,但是這個确實看起來比較簡單易讀。前面的兩個方法雖然麼有什麼問題,但是我想StringUtils.equals還是值得考慮的。
2)isEmpty,isNotEmpty,isBlank,isNotBlank
和前面一樣,這些方法相對于jdk提供的isEmpty方法來說,多了一個“空指針安全”,即不用考慮傳遞參數的空值問題,讓我們來看一個例子:
Java代碼
- if(myString != null && !myString.isEmpty()) {
- // 有點臃腫是把?
- // Do stuff with myString
- }
- if(StringUtils.isNotEmpty(myString)) { // 好多了吧
- // Do stuff with myString
- }
源代碼 複制 列印
- if(myString != null && !myString.isEmpty()) {
- // 有點臃腫是把?
- // Do stuff with myString
- }
- if(StringUtils.isNotEmpty(myString)) { // 好多了吧
- // Do stuff with myString
- }
Blank和empty的差別
isBlank将在字元串含有空白字元的時候,傳回true,例如:
Java代碼
- String someWhiteSpace = " \t \n";
- StringUtils.isEmpty(someWhiteSpace); // false
- StringUtils.isBlank(someWhiteSpace); // true
源代碼 複制 列印
- String someWhiteSpace = " \t \n";
- StringUtils.isEmpty(someWhiteSpace); // false
- 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代碼
- public void possiblyNotWhatYouWant() {
- String contrivedExampleString = "one.two.three.four";
- String[] result = contrivedExampleString.split(".");
- System.out.println(result.length); // 0
- }
源代碼 複制 列印
- public void possiblyNotWhatYouWant() {
- String contrivedExampleString = "one.two.three.four";
- String[] result = contrivedExampleString.split(".");
- System.out.println(result.length); // 0
- }
上面很明顯你希望按照.分隔,但是jdk了解的“.”是正規表達式的任意字元,導緻字元串内任意字元都比對,傳回一個size=0的字元串數組。其實你隻要傳遞"\\."就行了,但是這個确實是一個問題。
這樣,使用StringUtils.split就簡單多了,另外,我測試還發現StringUtils.split比jdk自帶的split要快四倍。
4)public static String join(Iterable iterable,String separator)
這個方法确實很實用,因為jdk自身沒有提供,簡單使用方法:
Java代碼
- String[] numbers = {"one", "two", "three"};
- StringUtils.join(numbers,","); // returns "one,two,three"
源代碼 複制 列印
- String[] numbers = {"one", "two", "three"};
- StringUtils.join(numbers,","); // returns "one,two,three"
當然你可以傳遞一個數字或者疊代序列iterators.
好了,我确信,這個庫确實是一個比較實用的庫,推薦大家使用。
API請參考: http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringUtils.html