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));
L'argument de la fonction passé à la map()
méthode prend un nombre x
et 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'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'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 );
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 String
comme 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 URI
constructeur 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.
GO TO FULL VERSION