Java 11: neu in String

Hallo allerseits! Seit der Veröffentlichung von Java 11 ist ein Tag vergangen, und jetzt erscheinen bereits die ersten Überprüfungen der Veröffentlichung. Ich werde meinen kleinen Artikel dem Unsichtbaren für offizielle Veröffentlichungen widmen und daher der Aufmerksamkeitsaktualisierung der String-Klasse beraubt, zumal er in der offiziellen Dokumentation von 11. Java nicht erwähnt wird (ich habe auf jeden Fall keine Informationen darüber gefunden).

Wenn wir uns die String-Klasse ansehen, finden wir unter den vielen uns bekannten Methoden mehrere, die als "@since 11" markiert sind. Und ja, offiziell sind sie erst gestern in Java erschienen.

Natürlich kann es große Zweifel an der Nützlichkeit jeder Funktion geben, da die nützlichsten und notwendigsten Funktionen bereits in früheren Versionen von Java geschrieben wurden, aber sie könnten für jemanden nützlich sein. Der Artikel war kurz, aber nicht nur meine Schuld, sondern auch die Schuld von Oracle - sie enthielten nur 4 (+2) Methoden in der Version, was natürlich nicht ausreicht.

Fangen wir an.

strip ();


Diese Methode entfernt alle Leerzeichen vor dem ersten Nicht-Leerzeichen und nach dem letzten. Zum Beispiel:

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

Das auf dem Bildschirm angezeigte Ergebnis lautet:

 original: < a > strip: <a> 

Die strip () -Methode hat zwei Cousins ​​- stripLeading () und stripTrailing (). Das erste - entfernt nur Leerzeichen vor dem ersten Nicht-Leerzeichen. Der zweite ist nur dahinter.

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

Wir bekommen das Ergebnis:

 stripLeading: <a > stripTrailing: < a> 

UPD


Hier in den Kommentaren schlagen sie vor, dass es nicht schaden würde zu sehen, was der Unterschied mit derselben trim () -Methode ist, die im Wesentlichen dasselbe tut.

Wir schauen. Es gibt wirklich Unterschiede.

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

Wie wir sehen, wird in der alten Implementierung unter Verwendung von zwei Iterationen zuerst der Index des ersten Nichtraums und dann der Index des letzten Nichtraums berechnet, und dann wird eine neue Zeile geschnitten und aus diesen Daten zurückgegeben. Nur Lücken werden abgeschnitten, beachten Sie dies.

Schauen Sie sich nun die strip () -Methode an.

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

Die neue Methode bestimmt im Allgemeinen alle Fälle, in denen das Symbol nicht sichtbar ist, ob es sich um ein Leerzeichen, eine Registerkarte usw. handelt. (Wer möchte, kann in den Dschungel der isWhiteSpace-Implementierung eintauchen).

Daher ist die neue Methode vorzuziehen, wenn Sie nicht nur Leerzeichen, sondern im Allgemeinen alle unsichtbaren Zeichen kürzen möchten.

isBlank ();


Die Methode gibt das Ergebnis der Abfrage zurück, ob diese Zeichenfolge "leer" ist und keine Zeichen außer Leerzeichen, Tabulatoren und anderen unsichtbaren Zeichen enthält.

Das heißt, wenn wir diesen Code ausführen:

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

Das Ergebnis wird sein:

 true 

Innerhalb der Methode selbst gibt es zwei Implementierungen - für lateinische Zeichen und für eine UTF-16-codierte Zeichenfolge.

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

wiederhole ();


Diese Methode kopiert den Inhalt der Zeichenfolge eine bestimmte Anzahl von Malen und gibt das Ergebnis in einer Zeile zurück.

Zum Beispiel durch Ausführen des Codes:

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

Wir werden bekommen:

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

Wenn die Anzahl der Iterationen Null ist, enthält die Zeichenfolge überhaupt keine Zeichen.

 String blank = sample.repeat(0); 

Ergebnis:

 length: 0 

lines ();


Es wäre seltsam zu erwarten, dass Oracle ein String-Update veröffentlicht, ohne eine Stream-API-Implementierung in die Klasse aufzunehmen. Und sie haben die Funktionalität in die String-Klasse aufgenommen.

Die Linienmethode konvertiert alle Linien einer Linie in den entsprechenden Stream. Es sieht so aus:

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

Wir bekommen das Ergebnis:

 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. 

Wir haben einen vollen Stream, mit dem wir dann alles machen können, was wir normalerweise mit normalen Streams machen. Die Anwendung hierfür kann sehr unterschiedlich sein, und ich hoffe, dass eine solche Funktion von den Entwicklern sehr positiv aufgenommen wird.

Wenn Sie sich die Methode selbst ansehen, werden Sie feststellen, dass zum Konvertieren eines Strings in Stream je nach Codierung des Strings zwei Splitter zur Auswahl verwendet werden.

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

Damit ist die Liste der Release-Innovationen im String-Teil abgeschlossen. Wenn ich etwas verpasst habe, bin ich froh, davon zu erfahren und es der Bewertung hinzuzufügen. Sie können alle vorgestellten Codebeispiele selbst in der Ressource auf dem Github fühlen.

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


All Articles