83 votes

Comment découper une Chaîne en un Flux de données de Chaînes de caractères?

Quelle est la meilleure méthode de découpage d'une Chaîne dans un Ruisseau?

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:

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

}

116voto

Holger Points 13789

Eh bien, depuis String.split renvoie un tableau, je recommande toujours d' Arrays.stream comme canoniques idiome pour la diffusion sur un tableau. Stream.of est un varargs méthode qui arrive juste à accepter un tableau, en raison du fait que les varargs moyens sont mis en œuvre via des tables et il y avait des problèmes de compatibilité lors de l'varargs ont été introduites pour Java et les méthodes existantes de rénovation à accepter la variable d'arguments.

Pattern.compile(",").splitAsStream(string) a l'avantage de streaming directement plutôt que de créer un intermédiaire tableau. Donc, pour un grand nombre de sous-chaînes de caractères, cela peut avoir un avantage de performance. D'autre part, si le délimiteur est trivial, c'est à dire un seul caractère littéral, l' String.split mise en œuvre passera par une voie rapide au lieu d'utiliser le moteur d'expressions régulières. Donc dans ce cas, la réponse n'est pas triviale.

Si la diffusion se fait à l'intérieur un autre flux, par exemple, .flatMap(Pattern.compile(pattern) ::splitAsStream) il y a l'avantage que le modèle doit être analysé qu'une seule fois, plutôt que pour chaque chaîne de l'extérieur de flux.

2voto

Alexey Soshin Points 6366

En ce qui concerne (1) et (2) qu'il ne faut pas beaucoup de différence, que votre code est presque la même.
Quant à (3), qui serait beaucoup plus efficace en termes de mémoire (pas nécessairement CPU), mais à mon avis, un peu plus difficile à lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X