Перейти к основному содержимому

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

· 5 мин. чтения

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<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. Объедините две коллекции с помощью фильтра

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

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

Затем давайте присоединим массив к строке с помощью коллектора:

@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 :

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

Далее давайте создадим String из Map .

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

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

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

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

@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. Обрабатывайте нулевые значения при присоединении

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

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

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

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

Далее разобьем массив по длине слов:

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

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

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

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

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

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

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

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