Operaciones de cadenas con secuencias de Java

1. Información general

Java 8 ha introducido una nueva API Stream que nos permite procesar datos de forma declarativa.

En este artículo rápido, aprenderíamos cómo usar la API Stream para dividir una cadena separada por comas en una lista de cadenas y cómo unir una matriz de cadenas en una cadena separada por comas .

También veremos cómo convertir una matriz de cadenas en un mapa usando Stream API.

Casi todo el tiempo nos enfrentamos a situaciones en las que necesitamos iterar algunas colecciones de Java y filtrar la colección en función de alguna lógica de filtrado. En un enfoque tradicional para este tipo de situación, usaríamos muchos bucles y operaciones if-else para obtener el resultado deseado.

Si desea leer más sobre Stream API, consulte este artículo.

2. Unión de cadenas con la API Stream

Usemos la API Stream para crear una función que uniría una matriz de cadenas en una cadena separada por comas :

public static String join(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",")); }

Puntos a tener en cuenta aquí:

  • La función stream () convierte cualquier colección en un flujo de datos
  • La función map () se utiliza para procesar los datos.
  • También hay otra función, llamada filter () , donde podemos incluir criterios de filtrado

Puede haber escenarios en los que queramos unir una Cadena con algún prefijo y sufijo fijo. Con la API Stream podemos hacer eso de la siguiente manera:

public static String joinWithPrefixPostfix(String[] arrayOfString){ return Arrays.asList(arrayOfString) .stream() //.map(...) .collect(Collectors.joining(",","[","]")); }

Como podemos ver en el método Collectors.joining () , estamos declarando nuestro prefijo como '[' y el sufijo como ']' ; por lo tanto, la cadena generada se creará con el formato [… ..] declarado .

3. División de cadenas con Stream API

Ahora, creemos una función, que dividiría una Cadena separada por comas en una lista de Cadena usando Stream API:

public static List split(String str){ return Stream.of(str.split(",")) .map (elem -> new String(elem)) .collect(Collectors.toList()); }

También es posible convertir directamente una cadena en una lista de caracteres utilizando la API de transmisión :

public static List splitToListOfChar(String str) { return str.chars() .mapToObj(item -> (char) item) .collect(Collectors.toList()); }

Un hecho interesante a tener en cuenta aquí es que el método chars () convierte el String en un flujo de Integer donde cada valor Integer denota el valor ASCII de todas y cada una de las secuencias Char . Es por eso que necesitamos encasillar explícitamente el objeto mapeador en el método mapToObj () .

4. Matriz de cadenas para asignar con Stream API

También podemos convertir una matriz de cadenas en un mapa usando split y Collectors.toMap , siempre que cada elemento de la matriz contenga una entidad clave-valor concatenada por un separador:

public static Map arrayToMap(String[] arrayOfString) { return Arrays.asList(arrayOfString) .stream() .map(str -> str.split(":")) .collect(toMap(str -> str[0], str -> str[1])); }

Aquí, ":" es el separador clave-valor para todos los elementos de la matriz de cadenas.

Recuerde que para evitar errores de compilación, debemos asegurarnos de que el código se compile con Java 1.8 . Para hacer esto, necesitamos agregar el siguiente complemento en el pom.xml :

   org.apache.maven.plugins maven-compiler-plugin 3.3  1.8 1.8    

5. Prueba

Como hemos terminado de crear las funciones, creemos casos de prueba para verificar el resultado.

Primero, probemos nuestro método de unión simple:

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

A continuación, creemos otro para probar nuestra sencilla función de división:

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

Finalmente, probemos nuestra matriz de cadenas para asignar la funcionalidad:

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

De la misma manera, necesitamos crear el resto de los casos de prueba.

6. Conclusión

Stream API nos proporciona sofisticadas técnicas de procesamiento de datos. Esta nueva forma de escribir código es muy eficiente en términos de gestión de la memoria del montón en un entorno de subprocesos múltiples.

Como siempre, el código fuente completo está disponible en Github.