1概要

このチュートリアルでは、Guavaライブラリの

Joiner



Splitter

の使い方を学びます。

Joiner

を使用してコレクションをStringに変換し、

Splitter

を使用してStringをコレクションに分割します。


2

Joiner


を使用して

List



String

に変換


Joiner

を使用して

List



String

に結合する簡単な例から始めましょう。次の例では、カンマ“、”を区切り文字として使用して、名前の

List

を1つの

String

に結合します。

@Test
public void whenConvertListToString__thenConverted() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    String result = Joiner.on(",").join(names);

    assertEquals(result, "John,Jane,Adam,Tom");
}


3

Joiner


を使用して

Map



String

に変換

次に、

Joiner

を使用して

Map



String

に変換する方法を見てみましょう。

次の例では、

withKeyValueSeparator()

を使用してキーとその値を結合します。

@Test
public void whenConvertMapToString__thenConverted() {
    Map<String, Integer> salary = Maps.newHashMap();
    salary.put("John", 1000);
    salary.put("Jane", 1500);
    String result = Joiner.on(" , ").withKeyValueSeparator(" = ")
                                    .join(salary);

    assertThat(result, containsString("John = 1000"));
    assertThat(result, containsString("Jane = 1500"));
}


4入れ子になったコレクションに参加する

それでは、ネストしたコレクションを

String

に結合する方法を見てみましょう。次の例では、各

List



String

に変換した結果を結合します。

@Test
public void whenJoinNestedCollections__thenJoined() {
    List<ArrayList<String>> nested = Lists.newArrayList(
      Lists.newArrayList("apple", "banana", "orange"),
      Lists.newArrayList("cat", "dog", "bird"),
      Lists.newArrayList("John", "Jane", "Adam"));
    String result = Joiner.on(";").join(Iterables.transform(nested,
      new Function<List<String>, String>() {
          @Override
          public String apply(List<String> input) {
              return Joiner.on("-").join(input);
          }
      }));

    assertThat(result, containsString("apple-banana-orange"));
    assertThat(result, containsString("cat-dog-bird"));
    assertThat(result, containsString("apple-banana-orange"));
}


5

Joiner


を使用中にnull値を処理する

それでは、

Joiner

を使用しながらnull値を処理するさまざまな方法を見てみましょう。

コレクションへの参加中にnull値をスキップするには、次の例のように__skipNulls()を使用します。

@Test
public void whenConvertListToStringAndSkipNull__thenConverted() {
    List<String> names = Lists.newArrayList("John", null, "Jane", "Adam", "Tom");
    String result = Joiner.on(",").skipNulls().join(names);

    assertEquals(result, "John,Jane,Adam,Tom");
}

null値をスキップせずに、代わりに

置き換えたい

場合は、次の例のように

useForNull()

を使用します。

@Test
public void whenUseForNull__thenUsed() {
    List<String> names = Lists.newArrayList("John", null, "Jane", "Adam", "Tom");
    String result = Joiner.on(",").useForNull("nameless").join(names);

    assertEquals(result, "John,nameless,Jane,Adam,Tom");
}


useForNull()

は元のリストを変更するのではなく、結合の出力にのみ影響することに注意してください。


6.

Splitter


を使用して

String

から

List

を作成します.

それでは、

String



List

に分割する方法を見てみましょう。次の例では、入力

String



List

に分割するために「 – 」区切り文字を使用します。

@Test
public void whenCreateListFromString__thenCreated() {
    String input = "apple - banana - orange";
    List<String> result = Splitter.on("-").trimResults()
                                          .splitToList(input);

    assertThat(result, contains("apple", "banana", "orange"));
}


trimResults()

は、結果の部分文字列から先頭と末尾の空白を削除します。


7.

Splitter


を使用して

String

から

Map

を作成します.

次に、

Splitter

を使用して

String

から

Map

を作成する方法を見てみましょう。次の例では、

with

KeyValueSeparator()を使用して

String



Map

に分割します。

@Test
public void whenCreateMapFromString__thenCreated() {
    String input = "John=first,Adam=second";
    Map<String, String> result = Splitter.on(",")
                                         .withKeyValueSeparator("=")
                                         .split(input);

    assertEquals("first", result.get("John"));
    assertEquals("second", result.get("Adam"));
}


8

String

を複数の区切り記号

で分割する

それでは、

String

を複数の区切り記号で分割する方法を見てみましょう。次の例では、 “。”と “、”の両方を使用して

String

を分割しています。

@Test
public void whenSplitStringOnMultipleSeparator__thenSplit() {
    String input = "apple.banana,,orange,,.";
    List<String> result = Splitter.onPattern("[.,]")
                                  .omitEmptyStrings()
                                  .splitToList(input);

    assertThat(result, contains("apple", "banana", "orange"));
}


omitEmptyStrings()

は空の文字列を無視し、結果の

List

に追加しません。


9

String

を特定の長さに分割する

次に、

String

を特定の長さに分割する方法を見てみましょう。次の例では、

String

を3文字ごとに分割しています。

@Test
public void whenSplitStringOnSpecificLength__thenSplit() {
    String input = "Hello world";
    List<String> result = Splitter.fixedLength(3).splitToList(input);

    assertThat(result, contains("Hel", "lo ", "wor", "ld"));
}


10分割結果を制限する

最後に – 分割結果を制限する方法を見てみましょう。

Splitter

が特定の数の項目の後で分割を停止するようにしたい場合** – 次の例のように

limit()

を使用してください。

@Test
public void whenLimitSplitting__thenLimited() {
    String input = "a,b,c,d,e";
    List<String> result = Splitter.on(",")
                                  .limit(4)
                                  .splitToList(input);

    assertEquals(4, result.size());
    assertThat(result, contains("a", "b", "c", "d,e"));
}


11結論

このチュートリアルでは、Guavaで

Joiner



Splitter

の両方を使用して、コレクションと文字列の間でさまざまな変換を行う方法を説明しました。

これらすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/guava-collections

にあります。

– これはEclipseベースのプロジェクトです。インポートしてそのまま実行するのは簡単なはずです。