グアバ – コレクションの結合と分割
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ベースのプロジェクトです。インポートしてそのまま実行するのは簡単なはずです。