Рубрики
Без рубрики

Объединение и разделение массивов и коллекций в Java

Краткая статья со многими примерами объединения и разделения массивов и коллекций с использованием Java Stream API.

Автор оригинала: baeldung.

1. Обзор

В этом кратком уроке мы узнаем, как объединяться и разделяться Массивы и Коллекции в Java, хорошо используя поддержку нового потока .

2. Соедините Два Массива

Давайте начнем с объединения двух массивов вместе с помощью Stream.concat :

@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. Объедините Две Коллекции

Давайте сделаем то же самое объединение с двумя коллекциями :

@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. Соедините Две Коллекции С Помощью Фильтра

Теперь давайте объединим две Коллекции чисел, фильтрующих все, что больше 10:

@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. Соедините массив В строку

Далее, давайте объединим массив в Строку с помощью Коллектора:

@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. Объедините коллекцию В строку

Давайте сделаем то же самое, но с Коллекцией :

@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. Соедините карту В строку

Далее, давайте создадим Строку из Карты .

Процесс очень похож на предыдущие примеры, но здесь у нас есть дополнительный шаг, чтобы сначала присоединиться к каждой карте записи :

@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. Соедините Вложенные коллекции В строку

Давайте сделаем что-нибудь более сложное. Давайте объединим некоторые вложенные Коллекции в Строку .

В следующем примере мы сначала присоединяемся к каждой вложенной коллекции, а затем присоединяемся к результату каждой из них:

@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. Обрабатывайте Нулевые Значения При Соединении

Давайте посмотрим, как мы можем использовать Фильтр для пропуска любых нулевых значений:

@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. Разделите коллекцию на две части

Давайте разделим Коллекцию чисел на две Коллекции в середине:

@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. Разбейте массив по длине слова

Далее, давайте разделим массив на длину слов:

@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")));
}

12. Разбейте строку На Массив

Давайте теперь сделаем наоборот, разделим Строку на Массив:

@Test
public void whenConvertStringToArray_thenConverted() {
    String animals = "Dog, Cat, Bird, Cow";
    String[] result = animals.split(", ");

    assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
}

13. Разбить строку На Коллекцию

Этот пример похож на предыдущий, есть только дополнительный шаг для преобразования из Массива в Коллекцию :

@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")));
}

14. Разбейте строку На Карту

Теперь давайте создадим Карту из Строки . Нам нужно будет разделить нашу строку дважды, по одному разу для каждой записи и в последний раз для ключа и значений:

@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");
}

15. Разделенная Строка С Несколькими Разделителями

Наконец, давайте разделим Строку , которая имеет несколько разделителей, используя регулярное выражение, мы также удалим любые пустые результаты:

@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")));
}

16. Заключение

В этом уроке, используя простую функцию String.split и мощный поток Java 8 , мы проиллюстрировали, как объединять и разделять Массивы и Коллекции.

Вы можете найти код для этой статьи на GitHub .