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