web-dev-qa-db-fra.com

Comment diviser une chaîne en un flux de chaînes?

Quelle est la meilleure méthode pour fractionner une chaîne en un flux?

J'ai vu ces variations:

  1. Arrays.stream("b,l,a".split(","))
  2. Stream.of("b,l,a".split(","))
  3. Pattern.compile(",").splitAsStream("b,l,a")

Mes priorités sont:

  • La robustesse
  • Lisibilité
  • Performance

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

}
45
slartidan

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.

59
Holger

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.

2
Alexey Soshin