org.springframework.util.String.StringUtilsでやるべきことはあるのか?

なんの話か

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やEnumerationを配列にして返す。
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で代替できるものもあったけど……