Alors plus besoin de Kotlin ?
En fait on trouve deux avantages avec Kotlin concernant la manipulation de collections.
Premièrement, Kotlin génère un byte code java 6 compatible avec Android, alors que Java 8 ne l'est pas.
Ensuite, la syntaxe proposée par les streams de Java 8 est certes puissante, mais horriblement verbeuse quand on la compare avec Kotlin.
Java 8 a choisi de ne pas surcharger les interfaces historiques. Par conséquent il faut systématiquement convertir la collection en "stream" avant manipulation. Et si le résultat attendu est aussi une collection, une deuxième conversion est nécessaire. Passons aux exemples.
Pour filtrer une liste sur une valeur, il faut donc écrire ce genre de code :
List<String> result = source.stream().filter (
i -> i.endsWith(".txt")).collect(Collectors.toList());
Vous objecterez que c'est mieux qu'en Java 7, mais comparez avec le code équivalent en Kotlin :
val result = source.filter {it.endsWith(".txt")}
Pour générer une string avec une liste, Java 8 propose un collector spécifique :
String result = source.stream().collect(Collectors.joining(","));
Avec Kotlin, l'opération est simplement une nouvelle fonction de la collection :
val result = source.joinToString(",")
On pourrait multiplier les examples avec les autres opérations : map, minBy, groupBy...
Les streams ont quand même un intérêt : la performance. Prenons le code Kotlin suivant :
val result = source.filter {it.endsWith(".txt")}.first()
Ici, la liste sera entièrement parcourue et filtrée. Une nouvelle liste sera ensuite construite pour contenir tous les éléments qui auront passé le filtre, pour ensuite ne garder que le premier élément ! C'est à l'évidence un gâchis de mémoire et de temps.
Avec les stream Java 8, la fonction "filter" ne fait rien d'autre que bâtir un autre stream. C'est l'appel à la fonction "findFirst" qui déclenchera le travail, pour en faire le moins possible. Mais heureusement, Kotlin peut aussi travailler avec des streams :
val result = source.asSequence().filter {it.endsWith(".txt")}.first()
D'ailleurs, utiliser les stream peut être souvent judicieux pour économiser la mémoire en évitant les résultats intermédiaires lors de chaînes d'opération.
Aucun commentaire:
Enregistrer un commentaire