1. Обзор
Java 8 представила новый API Stream , который позволяет нам обрабатывать данные декларативным образом.
В этой краткой статье мы узнаем, как использовать API Stream для разделения разделенной запятыми Строки в список Строк и как объединить массив String в разделенную запятыми Строку .
Мы также рассмотрим, как преобразовать строковый массив в карту с помощью Stream API.
Почти все время мы сталкиваемся с ситуациями, когда нам нужно перебирать некоторые коллекции Java и фильтровать Коллекцию на основе некоторой логики фильтрации. В традиционном подходе для такого типа ситуаций мы бы использовали множество циклов и операций if-else, чтобы получить желаемый результат.
Если вы хотите узнать больше об Stream API, проверьте эту статью .
2. Соединение строк С потоковым API
Давайте используем Stream API для создания функции, которая соединит массив String в разделенную запятыми Строку :
public static String join(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",")); }
Моменты, которые следует отметить здесь:
- Функция stream() преобразует любую Коллекцию в поток данных
- функция map() используется для обработки данных
- Существует также другая функция с именем filter() , в которую мы можем включить критерии фильтрации
Могут быть сценарии, в которых мы можем захотеть присоединиться к строке с некоторым фиксированным префиксом и постфиксом. С помощью API Stream мы можем сделать это следующим образом:
public static String joinWithPrefixPostfix(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",","[","]")); }
Как мы видим в методе Collectors.joining () , мы объявляем наш префикс как ‘[‘ и постфикс как ‘]’ ; следовательно, сгенерированная Строка будет создана с объявленным […..] формат.
3. Разделение Строк С Помощью Stream API
Теперь давайте создадим функцию, которая разделит разделенную запятыми Строку на список String с помощью Stream API:
public static Listsplit(String str){ return Stream.of(str.split(",")) .map (elem -> new String(elem)) .collect(Collectors.toList()); }
Также можно напрямую преобразовать Строку в Символ список с помощью Stream API:
public static ListsplitToListOfChar(String str) { return str.chars() .mapToObj(item -> (char) item) .collect(Collectors.toList()); }
Здесь следует отметить один интересный факт: метод chars() преобразует Строку в поток Integer , где каждое Integer значение обозначает ASCII значение каждой последовательности Char . Вот почему нам нужно явно типизировать объект mapper в методе mapToObj () .
4. Строковый массив для сопоставления с потоковым API
Мы также можем преобразовать массив String в карту с помощью split и Collectors.toMap , при условии, что каждый элемент в массиве содержит объект ключ-значение, объединенный разделителем:
public static MaparrayToMap(String[] arrayOfString) { return Arrays.asList(arrayOfString) .stream() .map(str -> str.split(":")) .collect(toMap(str -> str[0], str -> str[1])); }
Здесь “:” является разделителем ключ-значение для всех элементов в строковом массиве.
Пожалуйста, помните, что для того, чтобы избежать ошибки компиляции, мы должны убедиться, что код компилируется с использованием Java 1.8 . Для этого нам нужно добавить следующий плагин в pom.xml :
org.apache.maven.plugins maven-compiler-plugin 3.3 1.8 1.8
5. Тестирование
Поскольку мы закончили создавать функции, давайте создадим тестовые случаи, чтобы проверить результат.
Во-первых, давайте протестируем наш простой метод соединения:
@Test public void givenArray_transformedToStream_convertToString() { String[] programmingLanguages = {"java", "python", "nodejs", "ruby"}; String expectation = "java,python,nodejs,ruby"; String result = JoinerSplitter.join(programmingLanguages); assertEquals(result, expectation); }
Затем давайте создадим еще один, чтобы проверить нашу простую функциональность разделения:
@Test public void givenString_transformedToStream_convertToList() { String programmingLanguages = "java,python,nodejs,ruby"; Listexpectation = new ArrayList<>(); expectation.add("java"); expectation.add("python"); expectation.add("nodejs"); expectation.add("ruby"); List result = JoinerSplitter.split(programmingLanguages); assertEquals(result, expectation); }
Наконец, давайте протестируем наш массив String для отображения функциональности:
@Test public void givenStringArray_transformedToStream_convertToMap() { String[] programming_languages = new String[] {"language:java","os:linux","editor:emacs"}; Mapexpectation=new HashMap<>(); expectation.put("language", "java"); expectation.put("os", "linux"); expectation.put("editor", "emacs"); Map result = JoinerSplitter.arrayToMap(programming_languages); assertEquals(result, expectation); }
Таким же образом нам нужно создать остальные тестовые случаи.
6. Заключение
Stream API предоставляет нам сложные методы обработки данных. Этот новый способ написания кода очень эффективен с точки зрения управления памятью кучи в многопоточной среде.
Как всегда, полный исходный код доступен на Github .