Opérations de chaîne avec des flux Java

1. Vue d'ensemble

Java 8 a introduit une nouvelle API Stream qui nous permet de traiter les données de manière déclarative.

Dans cet article rapide, nous allons apprendre à utiliser l' API Stream pour diviser une chaîne séparée par des virgules en une liste de chaînes et comment joindre un tableau de chaînes en une chaîne séparée par des virgules .

Nous verrons également comment convertir un tableau de chaînes en mappage à l'aide de l' API Stream .

Presque tout le temps, nous sommes confrontés à des situations dans lesquelles nous devons itérer certaines collections Java et filtrer la collection en fonction d'une logique de filtrage. Dans une approche traditionnelle pour ce type de situation, nous utiliserions beaucoup de boucles et d'opérations if-else pour obtenir le résultat souhaité.

Si vous souhaitez en savoir plus sur l' API Stream , consultez cet article.

2. Joindre des chaînes avec l' API Stream

Utilisons l' API Stream pour créer une fonction qui joindrait un tableau de chaînes dans une chaîne séparée par des virgules :

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

Points à noter ici:

  • La fonction stream () convertit n'importe quelle collection en un flux de données
  • La fonction map () est utilisée pour traiter les données
  • Il existe également une autre fonction, nommée filter () , où nous pouvons inclure des critères de filtrage

Il peut y avoir des scénarios dans lesquels nous souhaitons joindre une chaîne avec un préfixe et un suffixe fixes. Avec l' API Stream, nous pouvons le faire de la manière suivante:

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

Comme nous pouvons le voir dans la méthode Collectors.joining () , nous déclarons notre préfixe comme «[» et postfix comme «]» ; par conséquent, la chaîne générée sera créée avec le format déclaré [… ..] .

3. Division des chaînes avec l' API Stream

Maintenant, créons une fonction, qui diviserait une chaîne séparée par des virgules en une liste de chaînes à l' aide de l' API Stream :

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

Il est également possible de convertir directement une chaîne en liste de caractères à l'aide de l' API Stream :

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

Un fait intéressant à noter ici est que la méthode chars () convertit la chaîne en un flux d' entiers où chaque valeur entière dénote la valeur ASCII de chaque séquence Char . C'est pourquoi nous devons typer explicitement l'objet mapper dans la méthode mapToObj () .

4. Tableau de chaînes à mapper avec l' API Stream

Nous pouvons également convertir un tableau String en mappage à l'aide de split et Collectors.toMap , à condition que chaque élément du tableau contienne une entité clé-valeur concaténée par un séparateur:

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

Ici, «:» est le séparateur clé-valeur de tous les éléments du tableau String.

N'oubliez pas que pour éviter les erreurs de compilation, nous devons nous assurer que le code est compilé avec Java 1.8 . Pour ce faire, nous devons ajouter le plugin suivant dans le pom.xml :

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

5. Test

Puisque nous avons fini de créer les fonctions, créons des cas de test pour vérifier le résultat.

Tout d'abord, testons notre méthode de jointure 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); }

Ensuite, créons-en un autre pour tester notre fonctionnalité de fractionnement simple:

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

Enfin, testons notre tableau String pour mapper les fonctionnalités:

@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 même manière, nous devons créer le reste des cas de test.

6. Conclusion

Stream API nous fournit des techniques de traitement de données sophistiquées. Cette nouvelle façon d'écrire du code est très efficace en termes de gestion de la mémoire du tas dans un environnement multi-thread.

Comme toujours, le code source complet est disponible sur Github.