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:
Arrays.stream("b,l,a".split(","))
-
Stream.of("b,l,a".split(","))
-
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.