1. 概要

このチュートリアルでは、Guavaライブラリジョイナーとスプリッターを使用する方法を学習します。 Joiner を使用してコレクションを文字列に変換し、Splitterを使用して文字列をコレクションに分割します。

2. Joiner を使用して、ListStringに変換します

Joinerを使用してListStringに結合する簡単な例から始めましょう。 次の例では、名前の 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 を使用して、MapStringに変換します

次へ– Joinerを使用してMapStringに変換する方法を見てみましょう。 次の例では、 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に結合する方法を見てみましょう。 次の例では、各ListStringに変換した結果を結合します。

@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の使用中にヌル値を処理する

次に、Joinerの使用中にヌル値を処理するさまざまな方法を見てみましょう。

コレクションへの参加中に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. スプリッターを使用して文字列からリストを作成します

では、StringListに分割する方法を見てみましょう。 次の例では、「-」区切り文字を使用して、入力StringListに分割します。

@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. スプリッターを使用して文字列からマップを作成します

次へ–スプリッターを使用して文字列からマップを作成する方法を見てみましょう。 次の例では、 withKeyValueSeparator()を使用して、StringMapに分割します。

@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 を分割するには、「、」を使用します。

@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()は空の文字列を無視し、結果のリストに追加しないことに注意してください。

9. 文字列を特定の長さに分割します

次へ–文字列を特定の長さに分割する方法を見てみましょう。 次の例では、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. 分割結果を制限する

最後に–分割結果を制限する方法を見てみましょう。 スプリッターから特定の数のアイテムの後で分割を停止する場合は、次の例のように 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でJoinerSplitterの両方を使用して、コレクションと文字列の間でさまざまな変換を行う方法を説明しました。

これらすべての例とコードスニペットの実装は、私のGuava githubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。