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() { Collectioncollection1 = 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() { Collectioncollection1 = 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() { Collectionanimals = 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() { Mapanimals = 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() { Collectionanimals = 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() { Collectionanimals = 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"; Collectionresult = 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"; Mapresult = 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"; Collectionresult = 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 .