Java 11: novo em String

Olá pessoal! Desde o lançamento do Java 11, um dia se passou e agora as primeiras revisões do lançamento já começaram a aparecer. Dedicarei meu pequeno artigo ao invisível para lançamentos oficiais e, portanto, privado da atualização de atenção da classe String, especialmente porque ele não é mencionado na documentação oficial do 11º Java (eu, de qualquer forma, não encontrei informações sobre ele).

De fato, se olharmos para a classe String, entre os muitos métodos familiares, encontraremos vários marcados como "@ desde 11" . E sim, oficialmente eles apareceram em Java apenas ontem.

Obviamente, pode haver grandes dúvidas sobre a utilidade de cada função, pois as funções mais úteis e necessárias já foram escritas nas versões anteriores do Java, mas podem ser úteis para alguém. O artigo foi curto, mas não foi apenas minha culpa, mas também da Oracle - eles incluíram apenas 4 (+2) métodos na versão, o que, é claro, não é suficiente.

Vamos começar.

tira ();


Este método remove todos os espaços antes do primeiro não espaço e depois do último. Por exemplo:

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

O resultado exibido na tela será:

 original: < a > strip: <a> 

O método strip () possui dois primos - stripLeading () e stripTrailing (). O primeiro - remove os espaços somente na frente, antes do primeiro não-espaço. O segundo está apenas para trás.

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

Nós obtemos o resultado:

 stripLeading: <a > stripTrailing: < a> 

UPD


Aqui nos comentários, eles sugerem que não faria mal ver qual é a diferença com o mesmo método trim (), que, em essência, faz o mesmo.

Nós olhamos. Realmente existem diferenças.

 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, na implementação antiga, usando duas iterações, o índice do primeiro não espaço é calculado primeiro e, em seguida, o índice do último não espaço, e uma nova linha é cortada e retornada a partir desses dados. Apenas as lacunas são cortadas, observe isso.

Agora observe o 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; } 

O novo método determina geralmente todos os casos em que o símbolo não está visível, se é um espaço, tabulação etc. (Quem quiser pode entrar na selva da implementação do isWhiteSpace).

Portanto, o novo método é preferível se você deseja aparar não apenas espaços, mas em geral todos os caracteres invisíveis.

isBlank ();


O método retorna o resultado da consulta se esta sequência está "vazia", ​​sem caracteres, exceto espaços, tabulações e outros caracteres invisíveis.

Ou seja, se executarmos este código:

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

O resultado será:

 true 

Dentro do método em si, existem duas implementações - para caracteres latinos e para uma sequência codificada em UTF-16.

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

repita ();


Este método copia o conteúdo da string um número especificado de vezes e retorna o resultado em uma linha.

Por exemplo, executando o código:

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

Nós teremos:

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

Se o número de iterações for zero, a sequência não conterá caracteres.

 String blank = sample.repeat(0); 

Resultado:

 length: 0 

linhas ();


Seria estranho esperar que a Oracle lançasse uma atualização de String sem incluir nenhuma implementação da API de Stream na classe. E eles incluíram a funcionalidade na classe String.

O método lines converte todas as linhas de uma linha no fluxo correspondente. É assim:

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

Nós obtemos o 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. 

Temos um fluxo completo, com o qual podemos fazer tudo o que costumamos fazer com fluxos comuns. A aplicação para isso pode ser muito diferente, e espero que esse recurso seja recebido calorosamente pelos desenvolvedores.

Se você olhar dentro do próprio método, veremos que, para converter uma string em Stream, dois divisores são usados, dependendo da codificação da string.

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

Isso conclui a lista de inovações de lançamento na parte String. Se eu perdi alguma coisa, ficarei feliz em saber sobre ela e adicioná-la à revisão. Você pode sentir todos os exemplos de código apresentados no recurso no github.

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


All Articles