【Guava】Splitterの使い方と注意点

Javaで文字列を分割するとき、標準のString.split()メソッドを使っている方も多いでしょう。ただ、split()は正規表現が前提のため、ちょっとした処理でもやや複雑になります。たとえば、空白の除去や空文字のスキップといった処理を毎回自分で書くのは面倒ですよね。

そんなときに便利なのが、Googleが提供するオープンソースライブラリ GuavaSplitter クラスです。Splitterを使えば、空要素の除去、トリム処理、Map変換などの処理を簡潔かつ直感的に記述できます。

この記事では、Splitterの基本的な使い方から便利なオプション、実務で役立つ活用例、そして使用上の注意点までを、初心者にもわかりやすく丁寧に解説します。

目次

Splitterとは?String.splitとの決定的な違い

Splitterは、Googleが提供するJavaライブラリ Guava に含まれるユーティリティクラスで、文字列を柔軟かつ直感的に分割できるのが特徴です。

Java標準のString.split()メソッドでも文字列を分割できますが、以下のような点で不便を感じることがあります。

  • 正規表現の知識が必要
  • 空要素の除去やトリム処理を毎回手動で記述する必要がある
  • Mapなど他のデータ構造への変換が煩雑

一方、Splitterを使えば、これらの処理をメソッドチェーンで簡潔に記述でき、可読性や保守性が格段に向上します。

たとえば、omitEmptyStrings()trimResults()といった便利なオプションを併用することで、分割と前処理を一括で記述可能です。

「ただ分割する」以上に、実務で必要なデータ整形処理を一貫して担えるのがSplitterの強みです。

Java標準のsplit()メソッドについては、下記記事で詳しく解説しています。

Splitterの基本的な使い方

Splitterの基本的な使い方は非常にシンプルです。まずは、カンマ区切りの文字列をリストに変換する典型的な例を見てみましょう。

List<String> result = Splitter.on(',') .splitToList("apple,banana,orange"); 
System.out.println(result); // [apple, banana, orange]

このように、Splitter.on(',')で区切り文字を指定し、splitToList()を呼び出すだけで、文字列が自動的にList<String>に変換されます。

区切りの指定は柔軟で、以下のように複数の方法が用意されています。

  • 単一文字で区切る:Splitter.on(',')
  • 文字列で区切る:Splitter.on("::")
  • 正規表現で区切る:Splitter.onPattern("\\s+")

このようにSplitterは、用途に応じて柔軟な分割処理が簡潔に記述できるのが大きな特長です。

よく使うオプション機能

Splitterには、実用性を高めるための便利なオプションが多数用意されています。ここでは、特に使用頻度の高いメソッドをいくつか紹介します。

omitEmptyStrings():空文字要素を除去

区切り文字が連続していた場合などに生成される空要素をリストに含めたくない場合に使います。

Splitter.on(',').omitEmptyStrings().splitToList("a,,b,"); // [a, b]

trimResults():前後の空白を自動で除去

各要素の先頭・末尾にある余分なスペースを自動的に取り除いてくれます。文字列の整形が必要な場面で非常に便利です。

Splitter.on(',').trimResults().splitToList(" a , b , c "); // [a, b, c]

fixedLength(int length):固定長で分割

一定の文字数ごとに分割したい場合に使用します。CSVや固定形式のログなどに便利です。

Splitter.fixedLength(3).splitToList("abcdefghi"); // [abc, def, ghi]

文字列の長さが割り切れない場合、最後の要素が短くなります。

withKeyValueSeparator():キーと値のペアをMapに変換

=:などで区切られたキーと値のペアを、Map<String, String>として取得できます。クエリ文字列や設定ファイルの読み取りなどに有効です。

Map<String, String> map = Splitter.on('&').withKeyValueSeparator('=').split("name=alice&age=30");
// {name=alice, age=30}

Map変換でキーが重複した場合、IllegalArgumentExceptionが発生します。


これらのオプションを組み合わせることで、分割処理と同時にデータの整形や構造化を簡潔に行うことができます。

Splitterの活用例

Splitterは単なる文字列分割にとどまらず、実務でよくあるデータ処理の場面でも活躍します。以下では、特に有用な3つの活用例を紹介します。

CSVやログファイルの前処理

CSVやログデータでは、カンマ区切りの項目に不要な空白や空要素が含まれることが多くあります。omitEmptyStrings()trimResults()を併用することで、クリーンなデータ抽出が簡単に実現できます。

URLクエリパラメータの解析

name=alice&amp;age=30 のようなクエリ文字列を、withKeyValueSeparator()を使ってMapに変換することで、手間なくパラメータを扱えるようになります。

構造化された独自フォーマットの処理

たとえば「ID001::value::timestamp」のような文字列や、固定長形式のログデータなど、標準APIでは扱いづらい形式でも、Splitterなら柔軟に対応可能です。on(String)fixedLength()を適切に組み合わせることで、構造化データの処理が効率化されます。

このようにSplitterは、複雑な文字列の分解処理を簡潔かつ安全に記述できる強力なツールとして、さまざまな場面で活用できます。

使用上の注意点とベストプラクティス

Splitterは非常に便利なユーティリティですが、正しく使うためにはいくつか注意すべきポイントがあります。以下では、トラブルを防ぐための使用上の注意点と、実践的なベストプラクティスを紹介します。

1. split()の戻り値はIterable

Splitter.split()Iterable<String>を返します。Listのようなランダムアクセスやサイズ取得が必要な場合は、splitToList()を使う方が扱いやすくおすすめです。

2. 正規表現を使う場合はonPattern()

Splitter.on()は文字や文字列が対象で、正規表現には対応していません。複数の空白や特殊なパターンで分割したい場合は、Splitter.onPattern()を使用しましょう。

List<String> words = Splitter.onPattern("\\s+").trimResults().splitToList("This is a test");
// [This, is, a, test]

3. null値は非対応

Splitterは入力文字列がnullである場合にNullPointerExceptionをスローします。事前にnullチェックを行うか、OptionalObjects.requireNonNull()でガードするのが安全です。

4. パフォーマンスを意識した使い方

大量の文字列を繰り返し分割する場面では、Splitterのインスタンスを毎回作らず、事前に定数として定義して再利用することでオーバーヘッドを削減できます。

private static final Splitter COMMA_SPLITTER = Splitter.on(',').omitEmptyStrings().trimResults();

まとめ:Splitterを使いこなして保守性アップ

Splitterを使えば、文字列の分割処理をより読みやすく、安全に、柔軟に記述することが可能になります。Java標準のsplit()に比べて、空要素の除去、トリム処理、Map変換などが簡潔に書けるため、実装と保守の負担を大きく軽減できます。

特に、CSVやログ、URLクエリパラメータなどのように構造化された文字列を扱う場面では、Splitterは非常に強力な選択肢となります。

小さなユーティリティでありながら、実務での文字列処理を確実に効率化できるSplitter。Guavaを導入しているプロジェクトであれば、積極的に活用する価値があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次