Java 11: nuevo en String

Hola a todos! Desde el lanzamiento de Java 11, ha pasado un día, y ahora las primeras revisiones del lanzamiento ya han comenzado a aparecer. Dedicaré mi pequeño artículo a lo invisible para los lanzamientos oficiales y, por lo tanto, no recibiré actualizaciones de la clase String, especialmente porque no se menciona en la documentación oficial del 11º Java (en cualquier caso, no encontré información al respecto).

De hecho, si miramos la clase String, entonces, entre los muchos métodos que nos son familiares, encontraremos varios marcados como "@ desde 11" . Y sí, oficialmente aparecieron en Java solo ayer.

Por supuesto, puede haber grandes dudas sobre la utilidad de cada función, ya que las funciones más útiles y necesarias ya estaban escritas en versiones anteriores de Java, pero podrían ser útiles para alguien. El artículo fue breve, pero esto no es solo culpa mía, sino también de Oracle: incluyeron solo 4 (+2) métodos en el lanzamiento, lo que, por supuesto, no es suficiente.

Empecemos

tira ();


Este método elimina todos los espacios antes del primer no espacio y después del último. Por ejemplo:

String withSpaces = " a "; String withoutSpaces = withSpaces.strip(); String OUTPUT_TEMPLATE = "<%s>" System.out.println(String.format(OUTPUT_TEMPLATE, withSpaces)); System.out.println(String.format(OUTPUT_TEMPLATE, withoutSpaces)); 

El resultado que se muestra en la pantalla será:

 original: < a > strip: <a> 

El método strip () tiene dos primos: stripLeading () y stripTrailing (). El primero: elimina los espacios solo delante, antes del primer no espacio. El segundo solo está detrás.

 String leading = withSpaces.stripLeading(); String trailing = withSpaces.stripTrailing(); 

Obtenemos el resultado:

 stripLeading: <a > stripTrailing: < a> 

UPD


Aquí en los comentarios sugieren que no estaría de más ver cuál es la diferencia con el mismo método trim (), que, en esencia, hace lo mismo.

Nosotros miramos. Realmente hay diferencias.

 public static String trim(byte[] value) { int len = value.length; int st = 0; while ((st < len) && ((value[st] & 0xff) <= ' ')) { st++; } while ((st < len) && ((value[len - 1] & 0xff) <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? newString(value, st, len - st) : null; } 

Como vemos, en la implementación anterior, usando dos iteraciones, el índice del primer no espacio se calcula primero, y luego el índice del último no espacio, y luego se corta una nueva línea y se devuelve a partir de estos datos. Solo se cortan los huecos, tenga en cuenta esto.

Ahora mira el método strip ().

  public static String strip(byte[] value) { int left = indexOfNonWhitespace(value); if (left == value.length) { return ""; } int right = lastIndexOfNonWhitespace(value); return ((left > 0) || (right < value.length)) ? newString(value, left, right - left) : null; } public static int indexOfNonWhitespace(byte[] value) { int length = value.length; int left = 0; while (left < length) { char ch = (char)(value[left] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } left++; } return left; } public static int lastIndexOfNonWhitespace(byte[] value) { int length = value.length; int right = length; while (0 < right) { char ch = (char)(value[right - 1] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } right--; } return right; } 

El nuevo método generalmente determina todos los casos en que el símbolo no es visible, ya sea un espacio, una pestaña, etc. (Aquellos que lo deseen pueden ingresar a la jungla de la implementación de isWhiteSpace).

Por lo tanto, el nuevo método es preferible si desea recortar no solo espacios, sino en general todos los caracteres invisibles.

isBlank ();


El método devuelve el resultado de la consulta si esta cadena está "vacía", no contiene caracteres, excepto espacios, tabulaciones y otros caracteres invisibles.

Es decir, si ejecutamos este código:

 String blank = " "; Boolean isBlank = blank.isBlank(); 

El resultado será:

 true 

Dentro del método en sí, hay dos implementaciones: para caracteres latinos y para una cadena codificada UTF-16.

  public boolean isBlank() { return indexOfNonWhitespace() == length(); } private int indexOfNonWhitespace() { if (isLatin1()) { return StringLatin1.indexOfNonWhitespace(value); } else { return StringUTF16.indexOfNonWhitespace(value); } } 

repetir ();


Este método copia el contenido de la cadena un número específico de veces y devuelve el resultado en una fila.

Por ejemplo, ejecutando el código:

 String sample = "(^_^) "; String multiple = sample.repeat(10); 

Obtendremos:

 (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) 

Si el número de iteraciones es cero, entonces la cadena no contendrá caracteres en absoluto.

 String blank = sample.repeat(0); 

Resultado:

 length: 0 

líneas ();


Sería extraño esperar que Oracle lance una actualización de String sin incluir ninguna implementación de Stream API en la clase. E incluyeron la funcionalidad en la clase String.

El método de líneas convierte todas las líneas de una línea en la Corriente correspondiente. Se ve así:

 String lines = "Blind Text Generator is a useful tool\n" + "which provides Lorem Ipsum and a number of alternatives.\n" + "The number of characters, words, and paragraphs\n" + "are easily controlled and you can set \n" + "the font to appreciate how it'll look in your design."; lines .lines() .map(l -> "next line: " + l) .forEach(System.out::println); 

Obtenemos el resultado:

 next line: Blind Text Generator is a useful tool next line: which provides Lorem Ipsum and a number of alternatives. next line: The number of characters, words, and paragraphs next line: are easily controlled and you can set next line: the font to appreciate how it'll look in your design. 

Tenemos una transmisión completa, con la cual podemos hacer todo lo que solemos hacer con transmisiones comunes. La aplicación para esto puede ser muy diferente, y espero que los desarrolladores reciban calurosamente dicha característica.

Si observa dentro del método en sí, veremos que para convertir una cadena a Stream, se utilizan dos divisores para elegir, dependiendo de la codificación de la cadena.

 public Stream<String> lines() { return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value); } 

Esto concluye la lista de innovaciones de lanzamiento en la parte String. Si me perdí algo, estaré encantado de saberlo y agregarlo a la revisión. Puede sentir todos los ejemplos de código presentados usted mismo en el recurso en el github.

Source: https://habr.com/ru/post/es424539/


All Articles