Spec-Zone.ru › Kotlin 1.7

Строки в Java и Kotlin

В этом руководстве представлены примеры выполнения типичных задач со строками в Java и Kotlin. Это поможет вам перейти с Java на Kotlin и писать код по-настоящему в стиле Kotlin.

Конкатенация строк

В Java это можно сделать следующим образом:

// Java
String name = "Joe";
System.out.println("Hello, " + name);
System.out.println("Your name is " + name.length() + " characters long");

В Kotlin используйте знак доллара ($) перед именем переменной, чтобы интерполировать значение этой переменной в строку:

fun main() {
//sampleStart
    // Kotlin
    val name = "Joe"
    println("Hello, $name")
    println("Your name is ${name.length} characters long")
//sampleEnd
}

Вы можете интерполировать значение сложного выражения, заключив его в фигурные скобки, как в ${name.length}. Для получения дополнительной информации см. шаблоны строк.

Построение строки

В Java можно использовать StringBuilder:

// Java
StringBuilder countDown = new StringBuilder();
for (int i = 5; i > 0; i--) {
    countDown.append(i);
    countDown.append("\n");
}
System.out.println(countDown);

В Kotlin используйте buildString() — встроенную функцию, которая принимает в качестве аргумента лямбду с логикой построения строки:

fun main() {
//sampleStart
       // Kotlin
       val countDown = buildString {
           for (i in 5 downTo 1) {
               append(i)
               appendLine()
           }
       }
       println(countDown)
//sampleEnd
}

Под капотом buildString используется тот же класс StringBuilder , что и в Java, а доступ к нему осуществляется через неявный this внутри лямбды.

Дополнительные сведения о правилах написания кода для лямбд.

Создание строки из элементов коллекции

В Java для фильтрации, отображения и последующего сбора элементов используется API потоков:

// Java
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
String invertedOddNumbers = numbers
        .stream()
        .filter(it -> it % 2 != 0)
        .map(it -> -it)
        .map(Object::toString)
        .collect(Collectors.joining(", "));
System.out.println(invertedOddNumbers);

В Kotlin используйте функцию joinToString(), которая определена в Kotlin для каждого списка:

fun main() {
//sampleStart
    // Kotlin
    val numbers = listOf(1, 2, 3, 4, 5, 6)
    val invertedOddNumbers = numbers
        .filter { it % 2 != 0 }
        .joinToString{ "${-it}" }
    println(invertedOddNumbers)
//sampleEnd
}

Дополнительные сведения об использовании joinToString().

Установление значения по умолчанию, если строка пустая

В Java можно использовать тернарный оператор:

// Java
public void defaultValueIfStringIsBlank() {
    String nameValue = getName();
    String name = nameValue.isBlank() ? "John Doe" : nameValue;
    System.out.println(name);
}

public String getName() {
    Random rand = new Random();
    return rand.nextBoolean() ? "" : "David";
}

Kotlin предоставляет встроенную функцию ifBlank(), которая принимает значение по умолчанию в качестве аргумента:

// Kotlin
import kotlin.random.Random

//sampleStart
fun main() {
    val name = getName().ifBlank { "John Doe" }
    println(name)
}

fun getName(): String =
    if (Random.nextBoolean()) "" else "David"
//sampleEnd

Замена символов в начале и конце строки

В Java можно использовать функции replaceFirst() и replaceAll(). В данном случае функция replaceAll() принимает регулярное выражение ##$, которое определяет строку, заканчивающуюся на ##:

// Java
String input = "##place##holder##";
String result = input.replaceFirst("##", "").replaceAll("##$", "");
System.out.println(result);

В Kotlin используйте функцию removeSurrounding() с разделителем строки ##:

fun main() {
//sampleStart
    // Kotlin
    val input = "##place##holder##"
    val result = input.removeSurrounding("##")
    println(result)
//sampleEnd
}

Замена вхождений

В Java можно использовать классы Pattern и Matcher, например, для маскирования данных:

// Java
String input = "login: Pokemon5, password: 1q2w3e4r5t";
Pattern pattern = Pattern.compile("\\w*\\d+\\w*");
Matcher matcher = pattern.matcher(input);
String replacementResult = matcher.replaceAll(it -> "xxx");
System.out.println("Initial input: '" + input + "'");
System.out.println("Anonymized input: '" + replacementResult + "'");

В Kotlin используйте класс Regex, который упрощает работу с регулярными выражениями. Кроме того, используйте сырые строки для упрощения шаблона регулярного выражения, уменьшив количество обратных слэшей:

fun main() {
//sampleStart
    // Kotlin
    val regex = Regex("""\w*\d+\w*""") // raw string
    val input = "login: Pokemon5, password: 1q2w3e4r5t"
    val replacementResult = regex.replace(input, replacement = "xxx")
    println("Initial input: '$input'")
    println("Anonymized input: '$replacementResult'")
//sampleEnd
}

Разделение строки

В Java для разделения строки с помощью символа точки (.) необходимо использовать экранирование (\\). Это происходит потому, что функция split() класса String принимает регулярное выражение в качестве аргумента:

// Java
System.out.println(Arrays.toString("Sometimes.text.should.be.split".split("\\.")));

В Kotlin используйте функцию Kotlin split(), которая принимает в качестве входных параметров аргументы с разделителями:

fun main() {
//sampleStart
    // Kotlin
    println("Sometimes.text.should.be.split".split("."))
//sampleEnd
}

Если вам необходимо разделение по регулярному выражению, используйте перегруженную версию split() , которая принимает Regex в качестве параметра.

Извлечение подстроки

В Java можно использовать функцию substring(), которая принимает инклюзивный начальный индекс символа для начала извлечения подстроки. Для извлечения подстроки после этого символа необходимо инкрементировать индекс:

// Java
String input = "What is the answer to the Ultimate Question of Life, the Universe, and Everything? 42";
String answer = input.substring(input.indexOf("?") + 1);
System.out.println(answer);

В Kotlin используйте функцию substringAfter() и не нужно вычислять индекс символа, после которого вы хотите извлечь подстроку:

fun main() {
//sampleStart
    // Kotlin
    val input = "What is the answer to the Ultimate Question of Life, the Universe, and Everything? 42"
    val answer = input.substringAfter("?")
    println(answer)
//sampleEnd
}

Кроме того, можно извлечь подстроку после последнего вхождения символа:

fun main() {
//sampleStart
    // Kotlin
    val input = "To be, or not to be, that is the question."
    val question = input.substringAfterLast(",")
    println(question)
//sampleEnd
}

Использование многострочных строк

До Java 15 существовало несколько способов создания многострочной строки. Например, использование функции join() класса String:

// Java
String lineSeparator = System.getProperty("line.separator");
String result = String.join(lineSeparator,
       "Kotlin",
       "Java");
System.out.println(result);

В Java 15 появились текстовые блоки. Следует учитывать один момент: если вы выводите многострочную строку, и тройная кавычка находится на следующей строке, то будет дополнительная пустая строка:

// Java
String result = """
    Kotlin
       Java
    """.stripIndent();
System.out.println(result);

Вывод:

Java 15 multiline output

Если вы разместите тройную кавычку в одной строке с последним словом, эта разница в поведении исчезнет.

В Kotlin вы можете форматировать строку с кавычками на новой строке, и в выводе не будет дополнительной пустой строки. Самый слева расположенный символ каждой строки определяет начало строки.

fun main() {
//sampleStart
    // Kotlin   
    val result = """
        Kotlin
           Java 
    """.trimIndent()
    println(result)
//sampleEnd
}

Вывод:

Kotlin multiline output

В Kotlin также можно использовать функцию trimMargin() для настройки отступов:

// Kotlin
fun main() {
    val result = """
       #  Kotlin
       #  Java
   """.trimMargin("#")
    println(result)
}

Дополнительные сведения о многострочных строках.

Что дальше?

  • Изучите другие приемы программирования на Kotlin.

  • Узнайте, как преобразовать существующий код Java в Kotlin с помощью конвертера Java в Kotlin.

Если у вас есть любимый прием программирования, приглашаем поделиться им, отправив запрос на изменение.

Последнее изменение: 15 сентября 2022 г.
Использование записей Java в Kotlin Коллекции в Java и Kotlin

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/java-to-kotlin-idioms-strings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API