Java 8 представила новый API Stream , который позволяет нам обрабатывать данные декларативным образом.
В этой краткой статье мы узнаем, как использовать API Stream для разделения разделенной запятыми Строки в список Строк и как объединить массив String в разделенную запятыми Строку .
Мы также рассмотрим, как преобразовать строковый массив в карту с помощью Stream API.
Почти все время мы сталкиваемся с ситуациями, когда нам нужно перебирать некоторые коллекции Java и фильтровать Коллекцию на основе некоторой логики фильтрации. В традиционном подходе для такого типа ситуаций мы бы использовали множество циклов и операций if-else, чтобы получить желаемый результат.
Если вы хотите узнать больше об Stream API, проверьте эту статью .
2. Соединение строк С потоковым API
Давайте используем Stream API для создания функции, которая соединит массив String в разделенную запятыми Строку :
Функция stream() преобразует любую Коллекцию в поток данных
функция map() используется для обработки данных
Существует также другая функция с именем filter() , в которую мы можем включить критерии фильтрации
Могут быть сценарии, в которых мы можем захотеть присоединиться к строке с некоторым фиксированным префиксом и постфиксом. С помощью API Stream мы можем сделать это следующим образом:
Как мы видим в методе Collectors.joining () , мы объявляем наш префикс как ‘[‘ и постфикс как ‘]’ ; следовательно, сгенерированная Строка будет создана с объявленным […..] формат.
3. Разделение Строк С Помощью Stream API
Теперь давайте создадим функцию, которая разделит разделенную запятыми Строку на список String с помощью Stream API:
public static List split(String str){
return Stream.of(str.split(","))
.map (elem -> new String(elem))
.collect(Collectors.toList());
}
Также можно напрямую преобразовать Строку в Символ список с помощью Stream API:
public static List splitToListOfChar(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 , при условии, что каждый элемент в массиве содержит объект ключ-значение, объединенный разделителем:
Здесь “:” является разделителем ключ-значение для всех элементов в строковом массиве.
Пожалуйста, помните, что для того, чтобы избежать ошибки компиляции, мы должны убедиться, что код компилируется с использованием Java 1.8 . Для этого нам нужно добавить следующий плагин в pom.xml :
Затем давайте создадим еще один, чтобы проверить нашу простую функциональность разделения:
@Test
public void givenString_transformedToStream_convertToList() {
String programmingLanguages = "java,python,nodejs,ruby";
List expectation = 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"};
Map expectation=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 .