Bonjour à tous! Depuis la sortie de Java 11, une journée s'est écoulée, et maintenant les premières critiques de la sortie ont déjà commencé à apparaître. Je vais consacrer mon petit article à l'invisible pour les sorties officielles et donc privé d'attention à la mise à jour de la classe String, d'autant plus qu'il n'est pas mentionné dans la
documentation officielle du 11ème Java (je n'ai en tout cas pas trouvé d'informations à ce sujet).

En effet, si nous regardons la classe String, alors parmi les nombreuses méthodes qui nous sont familières, nous en trouverons plusieurs marquées comme
"@since 11" . Et oui, officiellement, ils ne sont apparus à Java qu'hier.
Bien sûr, il peut y avoir de grands doutes sur l'utilité de chaque fonction, car les fonctions les plus utiles et nécessaires ont déjà été écrites dans les versions précédentes de Java, mais elles pourraient être utiles à quelqu'un. L'article était court, mais pas seulement ma faute, mais aussi la faute d'Oracle - ils ne comprenaient que 4 (+2) méthodes dans la version, ce qui, bien sûr, n'est pas suffisant.
Commençons.
bande ();
Cette méthode supprime tous les espaces avant le premier non-espace et après le dernier. Par exemple:
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));
Le résultat affiché à l'écran sera:
original: < a > strip: <a>
La méthode strip () a deux cousins - stripLeading () et stripTrailing (). Le premier - supprime les espaces uniquement devant, avant le premier non-espace. Le second n'est que derrière.
String leading = withSpaces.stripLeading(); String trailing = withSpaces.stripTrailing();
On obtient le résultat:
stripLeading: <a > stripTrailing: < a>
UPD
Ici, dans les commentaires, ils suggèrent que cela ne ferait pas de mal de voir quelle est la différence avec la même méthode trim (), qui, en substance, fait la même chose.
Nous regardons. Il y a vraiment des différences.
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; }
Comme nous le voyons, dans l'ancienne implémentation, en utilisant deux itérations, l'index du premier non-espace est calculé en premier, puis l'indice du dernier non-espace, puis une nouvelle ligne est coupée et renvoyée à partir de ces données. Seuls les écarts sont supprimés, notez cela.
Regardez maintenant la méthode 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; }
La nouvelle méthode détermine généralement tous les cas où le symbole n'est pas visible, qu'il s'agisse d'un espace, d'une tabulation, etc. (Ceux qui le souhaitent peuvent entrer dans la jungle de la mise en œuvre isWhiteSpace).
Ainsi, la nouvelle méthode est préférable si vous souhaitez supprimer non seulement les espaces, mais en général tous les caractères invisibles.
isBlank ();
La méthode renvoie le résultat de la requête si cette chaîne est "vide", ne contenant aucun caractère à l'exception des espaces, des tabulations et d'autres caractères invisibles.
Autrement dit, si nous exécutons ce code:
String blank = " "; Boolean isBlank = blank.isBlank();
Le résultat sera:
true
À l'intérieur de la méthode elle-même, il existe deux implémentations - pour les caractères latins et pour une chaîne codée UTF-16.
public boolean isBlank() { return indexOfNonWhitespace() == length(); } private int indexOfNonWhitespace() { if (isLatin1()) { return StringLatin1.indexOfNonWhitespace(value); } else { return StringUTF16.indexOfNonWhitespace(value); } }
répéter ();
Cette méthode copie le contenu de la chaîne un nombre spécifié de fois et renvoie le résultat sur une ligne.
Par exemple, en exécutant le code:
String sample = "(^_^) "; String multiple = sample.repeat(10);
Nous obtiendrons:
(^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^)
Si le nombre d'itérations est nul, la chaîne ne contiendra pas du tout de caractères.
String blank = sample.repeat(0);
Résultat:
length: 0
lignes ();
Il serait étrange de s'attendre à ce qu'Oracle publie une mise à jour de chaîne sans inclure aucune implémentation d'API Stream dans la classe. Et ils ont inclus la fonctionnalité dans la classe String.
La méthode des lignes convertit toutes les lignes d'une ligne dans le flux correspondant. Cela ressemble à ceci:
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);
On obtient le résultat:
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.
Nous avons obtenu un flux complet, avec lequel nous pouvons ensuite faire tout ce que nous faisons habituellement avec des flux ordinaires. L'application pour cela peut être très différente, et j'espère qu'une telle fonctionnalité sera chaleureusement reçue par les développeurs.
Si vous regardez à l'intérieur de la méthode elle-même, nous verrons que pour convertir une chaîne en Stream, deux séparateurs sont utilisés pour choisir, selon l'encodage de la chaîne.
public Stream<String> lines() { return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value); }
Ceci conclut la liste des innovations de version dans la partie String. Si j'ai raté quelque chose, je serai heureux de le savoir et de l'ajouter à la critique. Vous pouvez ressentir vous-même tous les exemples de code présentés dans la
ressource sur le github.