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

Строковые операции с потоками Java

Узнайте, как разделить строку, разделенную запятыми, на список строк и как объединить массив строк в строку, разделенную запятыми.

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

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 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 , при условии, что каждый элемент в массиве содержит объект ключ-значение, объединенный разделителем:

public static Map arrayToMap(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";

    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 .