una separar recorrer por otra manejo espacios dividir como caracteres cadenas cadena arreglo java regex split java-stream

java - separar - ¿Cómo dividir una cadena en una secuencia de cadenas?



recorrer una cadena en java (2)

Bueno, dado que String.split devuelve una matriz, siempre recomiendo Arrays.stream como el idioma canónico para transmitir en una matriz. Stream.of es un método varargs que simplemente acepta una matriz, debido al hecho de que los métodos varargs se implementan a través de matrices y hubo problemas de compatibilidad cuando se introdujeron las variables varargs en Java y se modificaron los métodos existentes para aceptar argumentos variables.

Pattern.compile(",").splitAsStream(string) tiene la ventaja de transmitir directamente en lugar de crear una matriz intermedia. Por lo tanto, para una gran cantidad de sub-cadenas, esto puede tener un beneficio de rendimiento. Por otro lado, si el delimitador es trivial, es decir, un solo carácter literal, la implementación de String.split pasará por una ruta rápida en lugar de usar el motor de expresiones regulares. Así que en este caso, la respuesta no es trivial.

Si la transmisión ocurre dentro de otra secuencia, por ejemplo .flatMap(Pattern.compile(pattern) ::splitAsStream) existe la ventaja de que el patrón debe analizarse solo una vez, en lugar de para cada cadena de la secuencia externa.

¿Cuál es el mejor método para dividir una cadena en una secuencia?

Vi estas variaciones:

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

Mis prioridades son:

  • Robustez
  • Legibilidad
  • Actuación

Un example completo, compilable:

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


Con respecto a (1) y (2) no debería haber mucha diferencia, ya que su código es casi el mismo.
Con respecto a (3), eso sería mucho más efectivo que los términos de memoria (no necesariamente CPU), pero en mi opinión, un poco más difícil de leer.