なんの話か
Spring bootで開発しているときに、
StringUtilsと名の付く外部ライブラリは2種類存在するんだなあ、と思った。
import文でいうと
・import org.apache.commons.lang3.StringUtils;
・org.springframework.util.StringUtils;
そいでもって、Web上で言及される「StringUtils」は
ほとんどがApache.Commons.Langのことを指す。
それどころか、javadocの説明に以下の文言あり。
StringUtils (Spring Framework 5.3.18 API)
>Mainly for internal use within the framework; consider Apache's Commons Lang for a more comprehensive suite of String
utilities.
より包括的なのは「Apache.Commons.Lang」だから、そちらの利用を検討してください。ということだ。
Springframework.Utilの存在意義は?
javadocには上記に続きこんなことも記載されている
>This class delivers some simple functionality that should really be provided by the core Java String
and StringBuilder
classes. It also provides easy-to-use methods to convert between delimited strings, such as CSV strings, and collections and arrays.
100%Web翻訳に頼った結果
このクラスは、コアの Java String クラスと StringBuilder
クラスによって実際に提供されるべき単純な機能を提供します。また、CSV 文字列などの区切り文字で区切られた文字列と、コレクションと配列の間で変換するための使いやすいメソッドも提供します。
単純な機能と文字区切り、配列の変換が得意です!ということらしい。
Apache.Commons.Langとの差別化要素としては文字区切りと配列の変換だろうか。
Springframework.Utilにしかないメソッド
思ったよりも多く、40メソッド以上存在するらしい。以下に並べておく。
比較対象
・StringUtils (Apache Commons Lang 3.12.0 API)
・StringUtils (Spring Framework 5.3.18 API)
比較方法
ExcelにWebの表をぺたぺたしたあと、Find関数で無理やりメソッド名だけを抽出して比較。絶対もっといい方法ありそう。
パラメーター違いのメソッドについては重複を除外。
Apache Commons Langとメソッド名だけ違って中身は同じ……とかは検証できないな
比較結果
Excelに書いたものを↓でhtml化。便利なツールを作れる方に感謝。
エクセルシートをHTMLテーブルに変換しちゃう君 (ββ) (styleme.jp)
メソッド名 | 概要 |
---|---|
addStringToArray | String配列にパラメーターの文字を追加したものを返す。 |
applyRelativePath | 絶対パスを相対パスに変換。 |
arrayToCommaDelimitedString | String配列をカンマ区切りの文字列に変換 |
arrayToDelimitedString | String配列をパラメーターの文字列に変換 |
cleanPath | パラメーターのPathを標準的なPathに変換してくれる。 |
collectionToCommaDelimitedString | Collectionをカンマ区切りの文字列に変換 |
collectionToDelimitedString | Collectionをパラメーターの文字列に変換 |
commaDelimitedListToSet | 文字列をカンマ区切りのSetに変換 |
commaDelimitedListToStringArray | 文字列をカンマ区切りのString配列に変換 |
concatenateStringArrays | パラーメーターに指定された配列を1つに連結する。重複は許可 |
countOccurrencesOf | 第1パラメーター文字列にいくつ第2パラメーター文字列が出現するかカウント |
delete | 第1パラメーター文字列に存在する第2パラメーター文字列をすべて削除 |
deleteAny | 第1パラメーター文字列に存在する第2パラメーター文字列をすべて削除 deleteと違うのは第2パラメーターについて1文字ずつ判定するということ。 charsToDelete - a set of characters to delete. E.g. "az\n" will delete 'a's, 'z's and new lines. |
delimitedListToStringArray | 第1パラメーター文字列を第2パラメーター文字列で区切った配列に変換 ?Splitと何が違うのか??? |
getFilename | Path形式の文字列からファイル名のみを変換 |
getFilenameExtension | Path形式の文字列から拡張子のみを変換 |
hasLength | 文字列に長さがあるかを判定する。Nullはfalseで半角スペースのみはtrue |
hasText | 文字列が実態のある文字列を含んでいるかを調べる。Apache Commons LangでいうところのisBlank StringUtils.hasText(null) = false StringUtils.hasText("") = false StringUtils.hasText(" ") = false StringUtils.hasText("12345") = true StringUtils.hasText(" 12345 ") = true |
matchesCharacter | 第1パラメーター文字列が1文字の第2パラメーターと一致するか調べる |
mergeStringArrays | Deprecated. |
parseLocale | 文字列パラメーターをLocaleクラスに変換する |
parseLocaleString | 文字列パラメーターをLocaleクラスに変換する。parseLocaleより変換条件が特殊らしい…… |
parseTimeZoneString | パラメーター文字列をTimeZoneクラスに変換する |
pathEquals | 2つのPathを比較し一致しているかを返却。Pathは標準化したうえで比較してくれるとのこと |
quote | 文字列にシングルクォートを付与してくれる |
quoteIfString | 文字列にシングルクォートを付与してくれる。パラメーターがObject型で、文字列の場合のみシングルクォートを付与してくれるらしい。特殊だ…… |
removeDuplicateStrings | 配列内の重複した要素を除外した配列を返す |
sortStringArray | 配列内の要素をソートして返す |
splitArrayElementsIntoProperties | 文字列配列を区切り文字で区切ってProperties型にして返す。(よくわからなかった……) |
stripFilenameExtension | Path形式の文字列から拡張子を取り除く。 |
substringMatch | 比較元をsubStringしたうえで、検証対象と一致しているかを返す 第1パラメーター:比較元 第2パラメーター:比較元のうち、subStringに利用するindex 第3パラメーター:検証対象 |
tokenizeToStringArray | 第1パラメーターをトークン化した配列を返す。 |
toLanguageTag | Deprecated. |
toStringArray | Collection |
trimAllWhitespace | 文字列すべての空白を取り除く |
trimArrayElements | 配列の要素をすべてtrimして、新しく配列を返す。Nullは返さないらしい |
trimLeadingCharacter | 文字列からleadingCharacterに指定された文字をすべて取り除く。 よくわからなかった…… |
trimLeadingWhitespace | 文字列から先頭の空白を取り除く |
trimTrailingCharacter | 文字列からtrailingCharacterに指定された文字をすべて取り除く。 よくわからなかった…… |
trimTrailingWhitespace | 文字列から末尾の空白を取り除く |
trimWhitespace | 文字列から先頭と末尾の空白を取り除く |
unqualify | "."やパラメーターで指定された文字で文字列を区切る。区切られた文字列のうち、最後の要素を返す パラメーター1つ: For example, "this.name.is.qualified", returns "qualified". パラメーター2つ:For example, "this:name:is:qualified" returns "qualified" if using a ':' separator. |
uriDecode | パラメーターのURI文字列をデコードする |
所感
意外とspringframework.util.String.StringUtilsの仕事はあった。
quoteやunqualifyは出番がありそう。
Pathsを使わずにファイル名操作ができるのもいい点。
SplitやReplaceで代替できるものもあったけど……