1. Conversion de données

La Stream<T>classe a également une méthode qui vous permet de convertir des données d'un type à un autre. Cette méthode est map().

Il renvoie également un flux, mais avec des éléments d'un type différent. La map()méthode prend comme argument de méthode une fonction qui convertit un type de données en un autre.

Exemples:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Conversion d'un Integerflux en Stringflux

L'argument de la fonction passé à la map()méthode prend un nombre xet renvoie sa représentation sous forme de chaîne. Au fait, vous pouvez écrire ce code de manière plus compacte :

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Conversion d'un Integerflux en Stringflux

Conversion d'une chaîne en nombre

De même, vous pouvez écrire du code pour convertir une chaîne en nombre — ce n'est pas compliqué non plus :

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Conversion d'un Stringflux en Integerflux

Conversion d'une chaîne en unURI

Les opérations de conversion de données peuvent être gourmandes en ressources et en temps. Disons que nous voulons convertir une collection de chaînes en objets URI. C'est très facile à faire, car le constructeur d'URI prend une chaîne comme argument.

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
Conversion d'un Stringflux en URIflux

Nous avons créé une collection et l'avons remplie avec 3 adresses Web. Ensuite, nous avons obtenu un Stream<String>objet de la collection, et à son tour, à partir de ce flux, nous avons obtenu un Stream<URI>objet. Nous avons passé à la méthode map une référence à la méthode qui sera utilisée pour convertir chaque chaîne en URI.

Cette méthode (constructeur) doit prendre a Stringcomme argument. Tout semble parfait...


2. Dérogations

On pourrait s'attendre à ce que le code ci-dessus fonctionne, mais ce ne sera pas le cas — le programme ne se compilera pas. Et pas parce que nous avons fait une erreur quelque part, mais parce que les créateurs de Java se sont trompés.

Il était une fois, ils ont eu la brillante idée d'ajouter une exception vérifiée ( URISyntaxException) au URIconstructeur de classe ! Et ces exceptions doivent être enveloppées dans un fichier try-catch.

Ainsi, la dernière ligne de notre code ressemblera à ceci :

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

Que pouvons-nous dire? Vous devriez réfléchir à deux fois avant d'utiliser une exception vérifiée . Et réfléchissez à trois fois avant de les utiliser dans un constructeur.