1概要

このクイックチュートリアルでは、新しいストリームサポート

__.


をうまく利用して、Javaで

Arrays



Collections__を結合および分割する方法を学びます。


2 2人を結合する

配列



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つを結合

コレクション


2つの

Collectionを使って同じ結合をしましょう:

@Test
public void whenJoiningTwoCollections__thenJoined() {
    Collection<String> collection1 = Arrays.asList("Dog", "Cat");
    Collection<String> collection2 = Arrays.asList("Bird", "Cow", "Moose");

    Collection<String> result = Stream.concat(
      collection1.stream(), collection2.stream())
      .collect(Collectors.toList());

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow", "Moose")));
}


4 2つの

コレクション

をフィルター

で結合する

それでは、10個を超えるものをフィルタリングする2つの

Collection

の数字を結合しましょう。

@Test
public void whenJoiningTwoCollectionsWithFilter__thenJoined() {
    Collection<String> collection1 = Arrays.asList("Dog", "Cat");
    Collection<String> collection2 = Arrays.asList("Bird", "Cow", "Moose");

    Collection<String> 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を使用してArrayを

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<String> 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

を作成しましょう。

このプロセスは前の例と非常に似ていますが、ここではそれぞれの

Map


Entry

を結合するための追加のステップがあります。

@Test
public void whenConvertMapToString__thenConverted() {
    Map<Integer, String> 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入れ子になった

Collection



String


に結合する

もう少し複雑なことをしましょう。入れ子になった

Collection



String

に結合しましょう。

次の例では、最初に入れ子になった各Collection内で結合してから、それぞれの結果を結合します。

@Test
public void whenConvertNestedCollectionToString__thenConverted() {
    Collection<List<String>> 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<String> 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<String> animals = Arrays.asList(
        "Dog", "Cat", "Cow", "Bird", "Moose", "Pig");
    Collection<String> result1 = new ArrayList<>();
    Collection<String> 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<Integer, List<String>> 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

に変換するための追加ステップが1つあります。

@Test
public void whenConvertStringToCollection__thenConverted() {
    String animals = "Dog, Cat, Bird, Cow";
    Collection<String> result = Arrays.asList(animals.split(", "));

    assertTrue(result.equals(Arrays.asList("Dog", "Cat", "Bird", "Cow")));
}


13.

String



Map


に分割する

それでは、

String

から

Map

を作成しましょう。エントリごとに1回、キーと値について最後に1回、文字列を2回分割する必要があります。

@Test
public void whenConvertStringToMap__thenConverted() {
    String animals = "1 = Dog, 2 = Cat, 3 = Bird";

    Map<Integer, String> 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<String> 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 8

Streamを利用して、

Arrays



Collectionsを結合して分割する方法を説明しました。

この記事のコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[over on GitHub]にあります。