Quelle est la meilleure méthode pour fractionner une chaîne en un flux?
J'ai vu ces variations:
Arrays.stream("b,l,a".split(","))
Stream.of("b,l,a".split(","))
Pattern.compile(",").splitAsStream("b,l,a")
Mes priorités sont:
Un complet, compilable exemple :
import Java.util.Arrays;
import Java.util.regex.Pattern;
import Java.util.stream.Stream;
public class HelloWorld {
public static void main(String[] args) {
stream1().forEach(System.out::println);
stream2().forEach(System.out::println);
stream3().forEach(System.out::println);
}
private static Stream<String> stream1() {
return Arrays.stream("b,l,a".split(","));
}
private static Stream<String> stream2() {
return Stream.of("b,l,a".split(","));
}
private static Stream<String> stream3() {
return Pattern.compile(",").splitAsStream("b,l,a");
}
}
Eh bien, puisque String.split
Renvoie un tableau, je recommande toujours Arrays.stream
Comme idiotisme canonique pour la diffusion en continu sur un tableau. Stream.of
Est une méthode varargs qui accepte un tableau, car les méthodes varargs sont implémentées via des tableaux et que des problèmes de compatibilité se posaient lorsque varargs était introduit en Java et les méthodes existantes réaménagées pour accepter les arguments variables.
Pattern.compile(",").splitAsStream(string)
a l'avantage de diffuser directement plutôt que de créer un tableau intermédiaire. Donc, pour un grand nombre de sous-chaînes, cela peut avoir un avantage de performance. En revanche, si le délimiteur est trivial, c’est-à-dire un seul caractère littéral, l’implémentation String.split
Passera par un chemin rapide au lieu d’utiliser le moteur de regex. Donc, dans ce cas, la réponse n’est pas anodine.
Si la diffusion a lieu dans un autre flux, par exemple, .flatMap(Pattern.compile(pattern) ::splitAsStream)
il y a l'avantage que le motif doit être analysé une seule fois, plutôt que pour chaque chaîne du flux externe.
En ce qui concerne (1) et (2), il ne devrait pas y avoir beaucoup de différence, car votre code est presque identique.
En ce qui concerne (3), ce serait beaucoup plus efficace en termes de mémoire (pas nécessairement de processeur), mais à mon avis, un peu plus difficile à lire.