«1. Введение

В Java 11 к обычно используемому классу String добавлено несколько полезных API. В этом руководстве мы рассмотрим и будем использовать эти новые API.

2. Repeat()

Как следует из названия, метод экземпляра Repeat() повторяет содержимое строки.

Возвращает строку, значение которой представляет собой конкатенацию строки, повторенной n раз, где n передается в качестве параметра:

@Test
public void whenRepeatStringTwice_thenGetStringTwice() {
    String output = "La ".repeat(2) + "Land";

    is(output).equals("La La Land");
}

Кроме того, repeat() возвращает пустую строку, если строка пуста или количество равен нулю.

3. strip*()

Метод экземпляра strip() возвращает строку с удаленными начальными и конечными пробелами:

@Test
public void whenStripString_thenReturnStringWithoutWhitespaces() {
    is("\n\t  hello   \u2005".strip()).equals("hello");
}

В Java 11 также добавлены методы stripLeading() и stripTrailing(), которые обрабатывают начальные и конечные пробелы соответственно.

3.1. Разница между strip() и trim()

strip*() определяет, является ли символ пробелом или нет, на основе Character.isWhitespace(). Другими словами, он знает о пробельных символах Unicode.

Это отличается от функции trim(), которая определяет пробел как любой символ, который меньше или равен символу пробела Unicode (U+0020). Если мы воспользуемся функцией trim() в предыдущем примере, мы получим другой результат:

@Test
public void whenTrimAdvanceString_thenReturnStringWithWhitespaces() {
    is("\n\t  hello   \u2005".trim()).equals("hello   \u2005");
}

Обратите внимание, как функция trim() смогла обрезать начальные пробелы, но не обрезала конечные пробелы. Это связано с тем, что функция trim() не знает о пробельных символах Unicode и, следовательно, не считает «\\u2005» пробельным символом.

4. isBlank()

Метод экземпляра isBlank() возвращает значение true, если строка пуста или содержит только пробелы. В противном случае он возвращает false:

@Test
public void whenBlankString_thenReturnTrue() {
    assertTrue("\n\t\u2005  ".isBlank());
}

Точно так же метод isBlank() знает о пробельных символах Unicode, как и strip().

5. lines()

Метод экземпляра lines() возвращает поток строк, извлеченных из строки, разделенных символами конца строки:

@Test
public void whenMultilineString_thenReturnNonEmptyLineCount() {
    String multilineStr = "This is\n \n a multiline\n string.";

    long lineCount = multilineStr.lines()
      .filter(String::isBlank)
      .count();

    is(lineCount).equals(3L);
}

Разделитель строки может быть одним из следующих: \\n”, “\\r” или “\\r\\n”.

Поток содержит строки в том порядке, в котором они встречаются. Ограничитель строки удаляется из каждой строки.

Этот метод следует предпочесть split(), так как он обеспечивает лучшую производительность при разбиении многострочного ввода.

6. Заключение

В этой быстрой статье мы рассмотрели новые API-интерфейсы String в Java 11.

Наконец, фрагменты кода можно найти на GitHub.