Javaで配列とコレクションを結合および分割する
1. 概要
このクイックチュートリアルでは、新しいストリームサポート.をうまく利用して、JavaでArraysとCollectionsを結合および分割する方法を学習します。
2. 2つのArraysを結合する
Stream.concat:を使用して2つのArraysを結合することから始めましょう
@Test
public void whenJoiningTwoArrays_thenJoined() {
String[] animals1 = new String[] { "Dog", "Cat" };
String[] animals2 = new String[] { "Bird", "Cow" };
String[] result = Stream.concat(
Arrays.stream(animals1), Arrays.stream(animals2)).toArray(String[]::new);
assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
}
3. 2つのCollectionsを結合する
2つのCollections:で同じ結合を行いましょう
@Test
public void whenJoiningTwoCollections_thenJoined() {
Collection collection1 = Arrays.asList("Dog", "Cat");
Collection collection2 = Arrays.asList("Bird", "Cow", "Moose");
Collection result = Stream.concat(
collection1.stream(), collection2.stream())
.collect(Collectors.toList());
assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow", "Moose")));
}
4. 2つのCollectionsをフィルターで結合する
それでは、10より大きいものをフィルタリングする2つのCollectionsの数値を結合しましょう。
@Test
public void whenJoiningTwoCollectionsWithFilter_thenJoined() {
Collection collection1 = Arrays.asList("Dog", "Cat");
Collection collection2 = Arrays.asList("Bird", "Cow", "Moose");
Collection result = Stream.concat(
collection1.stream(), collection2.stream())
.filter(e -> e.length() == 3)
.collect(Collectors.toList());
assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Cow")));
}
5. ArrayをStringに結合します
次に、Collector:を使用して配列をStringに結合しましょう
@Test
public void whenConvertArrayToString_thenConverted() {
String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow" };
String result = Arrays.stream(animals).collect(Collectors.joining(", "));
assertEquals(result, "Dog, Cat, Bird, Cow");
}
6. CollectionをStringに結合します
同じことをしますが、Collection:を使用します
@Test
public void whenConvertCollectionToString_thenConverted() {
Collection animals = Arrays.asList("Dog", "Cat", "Bird", "Cow");
String result = animals.stream().collect(Collectors.joining(", "));
assertEquals(result, "Dog, Cat, Bird, Cow");
}
7. MapをStringに結合します
次に、MapからStringを作成しましょう。
プロセスは前の例と非常に似ていますが、ここでは、最初に各MapEntryを結合するための追加の手順があります。
@Test
public void whenConvertMapToString_thenConverted() {
Map animals = new HashMap<>();
animals.put(1, "Dog");
animals.put(2, "Cat");
animals.put(3, "Cow");
String result = animals.entrySet().stream()
.map(entry -> entry.getKey() + " = " + entry.getValue())
.collect(Collectors.joining(", "));
assertEquals(result, "1 = Dog, 2 = Cat, 3 = Cow");
}
8. ネストされたCollectionsをStringに結合します
もう少し複雑なことをしましょう。 ネストされたCollectionsをStringに結合してみましょう。
次の例では、最初にネストされた各コレクション内で結合し、次にそれぞれの結果を結合します。
@Test
public void whenConvertNestedCollectionToString_thenConverted() {
Collection> nested = new ArrayList<>();
nested.add(Arrays.asList("Dog", "Cat"));
nested.add(Arrays.asList("Cow", "Pig"));
String result = nested.stream().map(
nextList -> nextList.stream()
.collect(Collectors.joining("-")))
.collect(Collectors.joining("; "));
assertEquals(result, "Dog-Cat; Cow-Pig");
}
9. 結合時にNull値を処理する
Filterを使用してnull値をスキップする方法を見てみましょう。
@Test
public void whenConvertCollectionToStringAndSkipNull_thenConverted() {
Collection animals = Arrays.asList("Dog", "Cat", null, "Moose");
String result = animals.stream()
.filter(Objects::nonNull)
.collect(Collectors.joining(", "));
assertEquals(result, "Dog, Cat, Moose");
}
10. Collectionを2つに分割する
数値のCollectionを中央で2つのCollectionsに分割しましょう。
@Test
public void whenSplitCollectionHalf_thenConverted() {
Collection animals = Arrays.asList(
"Dog", "Cat", "Cow", "Bird", "Moose", "Pig");
Collection result1 = new ArrayList<>();
Collection result2 = new ArrayList<>();
AtomicInteger count = new AtomicInteger();
int midpoint = Math.round(animals.size() / 2);
animals.forEach(next -> {
int index = count.getAndIncrement();
if (index < midpoint) {
result1.add(next);
} else {
result2.add(next);
}
});
assertTrue(result1.equals(Arrays.asList("Dog", "Cat", "Cow")));
assertTrue(result2.equals(Arrays.asList("Bird", "Moose", "Pig")));
}
11. Arrayを単語の長さで分割する
次に、単語の長さで配列を分割しましょう。
@Test
public void whenSplitArrayByWordLength_thenConverted() {
String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow", "Pig", "Moose"};
Map> result = Arrays.stream(animals)
.collect(Collectors.groupingBy(String::length));
assertTrue(result.get(3).equals(Arrays.asList("Dog", "Cat", "Cow", "Pig")));
assertTrue(result.get(4).equals(Arrays.asList("Bird")));
assertTrue(result.get(5).equals(Arrays.asList("Moose")));
}
11. StringをArrayに分割します
逆に、StringをArray:に分割しましょう
@Test
public void whenConvertStringToArray_thenConverted() {
String animals = "Dog, Cat, Bird, Cow";
String[] result = animals.split(", ");
assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
}
12. StringをCollectionに分割します
この例は前の例と似ていますが、ArrayからCollectionに変換するための追加の手順があります。
@Test
public void whenConvertStringToCollection_thenConverted() {
String animals = "Dog, Cat, Bird, Cow";
Collection result = Arrays.asList(animals.split(", "));
assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow")));
}
13. StringをMapに分割します
それでは、StringからMapを作成しましょう。 文字列を2回、各エントリごとに1回、キーと値ごとに1回分割する必要があります。
@Test
public void whenConvertStringToMap_thenConverted() {
String animals = "1 = Dog, 2 = Cat, 3 = Bird";
Map result = Arrays.stream(
animals.split(", ")).map(next -> next.split(" = "))
.collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1]));
assertEquals(result.get(1), "Dog");
assertEquals(result.get(2), "Cat");
assertEquals(result.get(3), "Bird");
}
14. 複数のセパレータでStringを分割
最後に、正規表現を使用して複数の区切り文字を持つStringを分割しましょう。また、空の結果も削除します。
@Test
public void whenConvertCollectionToStringMultipleSeparators_thenConverted() {
String animals = "Dog. , Cat, Bird. Cow";
Collection result = Arrays.stream(animals.split("[,|.]"))
.map(String::trim)
.filter(next -> !next.isEmpty())
.collect(Collectors.toList());
assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow")));
}
15. 結論
このチュートリアルでは、単純なString.split関数と強力なJava 8Stream,を活用して、ArraysとCollections.を結合および分割する方法を説明しました。
この記事over on GitHubのコードを見つけることができます。