org.apache.commons.lang.StringUtils
StringUtils是Apache Commons Lang( http://commons.apache.org/lang/ )的一部分,顧名思義,它提供了一些不錯的實用程序來處理String,這超出了java.lang.String所提供的功能。 它由50多種靜態方法組成,我不會覆蓋其中的每一個方法,而只是我最常使用的一些方法。
有兩個不同的版本,較新的org.apache.commons.lang3.StringUtils和較舊的org.apache.commons.lang.StringUtils 。 兩者之間確實沒有任何顯著差異。 lang3.StringUtils需要Java 5.0,可能是您要使用的版本。
公共靜態布爾值equals(CharSequence str1,CharSequence str2)
以為我會從最直接的方法之一開始。 等于 。 這完全符合您的期望,它接受兩個String,如果相同則返回true,否則返回false。
但是java.lang.String已經有一個完美的equals方法嗎? 我到底為什么要使用第三方實現?
這是一個公平的問題。 讓我們看一些代碼,您能看到任何問題嗎?
public void doStuffWithString(String stringParam) {if(stringParam.equals("MyStringValue")) {// do stuff}
}
那是一個NullPointerException等待發生!
有兩種解決方法:
public void safeDoStuffWithString1(String stringParam) {if(stringParam != null && stringParam.equals("MyStringValue")) {// do stuff}
}public void safeDoStuffWithString2(String stringParm) {if("MyStringValue".equals(stringParam)) {// do stuff}
}
我個人不喜歡這兩種方法。 我認為null會檢查污染代碼,對我來說,“ MyStringValue” .equals(stringParam)的掃描效果不佳,它看起來是錯誤的。
這是StringUtils.equals派上用場的地方,它是null安全的。 不管您通過什么,都不會變成NullPointer! 因此,您可以按以下方式重寫簡單方法:
public void safeDoStuffWithString3(String stringParam) {if(StringUtils.equals(stringParam,"MyStringValue)) {// do stuff}
}
這是個人喜好,但我認為這比前兩個示例更好。 它們沒有什么問題,但我確實認為StringUtils.equals()值得考慮。
isEmpty,isNotEmpty,isBlank,isNotBlank
好吧,這些看起來很容易解釋,我猜它們都是空安全的嗎?
您可能在這里發現了一種模式。 isEmpty實際上是java.lang.String.isEmpty()的空安全替代品,而isNotEmpty是相反的。 因此,不再有null檢查:
if(myString != null && !myString.isEmpty()) { // urghh// Do stuff with myString
}if(StringUtils.isNotEmpty(myString)) { // much nicer// Do stuff with myString
}
那么,為什么空白和空?
有所不同,如果String僅包含空格,則isBlank也返回true,即…
String someWhiteSpace = " \t \n";
StringUtils.isEmpty(someWhiteSpace); // false
StringUtils.isBlank(someWhiteSpace); // true
公共靜態String [] split(String str,String spacerChars)
對,看起來就像String.split(),所以這只是內置Java方法的null安全版本嗎?
好吧,是的,它當然是無效的。 嘗試拆分null字符串將導致null,并且null分隔符將在空白處拆分。 但是還有另一個原因,您應該考慮使用StringUtils.split(…) ,這就是java.lang.String.split使用正則表達式作為分隔符的事實。 例如,以下可能無法滿足您的要求:
public void possiblyNotWhatYouWant() {String contrivedExampleString = "one.two.three.four";String[] result = contrivedExampleString.split(".");System.out.println(result.length); // 0
}
但是我要做的就是在“。”前面加上兩個反斜杠。 它將正常工作。 沒什么大不了的嗎?
也許不是,但是使用StringUtils.split的最后一個優勢是,正則表達式很昂貴。 實際上,當我測試用逗號分割字符串時(根據我的經驗, 這是相當普遍的用例), StingUtils.split的運行速度快了四倍!
公共靜態字符串連接(可迭代,字符串分隔符)
啊,終于有真正有用的東西了!
的確,我從來沒有找到一種用分隔符將字符串連接起來的優雅方法,總有煩人的條件要求檢查是否要插入分隔符。 因此,很高興為我提供了一個實用程序。 這是一個簡單的示例:
String[] numbers = {"one", "two", "three"};
StringUtils.join(numbers,","); // returns "one,two,three"
還有各種采用Array和Iterators的重載版本。
好吧,我堅信。 這看起來像一個非常有用的庫,它還能做什么?
相當多,但是就像我之前說的,我不會打擾所有可用的方法,最后我會重復API文檔中的內容。 我真的建議您仔細看看: http : //commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringUtils.html
因此,基本上,如果您需要使用Java核心String庫未涵蓋的String(甚至可能包含的東西)做某事,請查看StringUtils。
參考:來自我們JCG合作伙伴的 Apache Commons Lang StringUtils ? Tom 's編程博客上的 Tom Jefferys。
翻譯自: https://www.javacodegeeks.com/2012/02/apache-commons-lang-stringutils.html