Spec-Zone.ru › Kotlin 1.7

Что нового в Kotlin 1.5.0

Дата выпуска: 5 мая 2021 года

Kotlin 1.5.0 включает новые языковые возможности, стабильный IR-основанный JVM-компилятор, улучшения производительности и эволюционные изменения, такие как стабилизация экспериментальных функций и устаревание устаревших.

Вы также можете найти обзор изменений в записи блога о выпуске.

Языковые возможности

Kotlin 1.5.0 предоставляет стабильные версии новых языковых возможностей, представленных для предварительного просмотра в 1.4.30:

  • Поддержка JVM-записей

  • Закрытые интерфейсы и улучшения закрытых классов

  • Встроенные классы

Подробные описания этих возможностей доступны в этой записи блога и на соответствующих страницах документации Kotlin.

Поддержка JVM-записей

Java быстро развивается, и для обеспечения совместимости Kotlin с ним мы внедрили поддержку одной из её последних функций – классы-записи.

Поддержка Kotlin для JVM-записей включает двустороннюю совместимость:

  • В Kotlin-коде вы можете использовать классы-записи Java так же, как и обычные классы с свойствами.

  • Чтобы использовать класс Kotlin в качестве записи в Java-коде, сделайте его data классом и отметьте его аннотацией @JvmRecord.

@JvmRecord
data class User(val name: String, val age: Int)

Узнайте больше о работе с JVM-записями в Kotlin.

Закрытые интерфейсы

В Kotlin интерфейсы теперь могут иметь модификатор sealed, который работает с интерфейсами так же, как и с классами: все реализации закрытого интерфейса известны на этапе компиляции.

sealed interface Polygon

Вы можете полагаться на этот факт, например, для написания исчерпывающих when выражений.

fun draw(polygon: Polygon) = when (polygon) {
   is Rectangle -> // ...
   is Triangle -> // …
   // else is not needed - all possible implementations are covered
}

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

class FilledRectangle: Polygon, Fillable

Узнайте больше о закрытых интерфейсах.

Иерархии закрытых классов по всему пакету

Закрытые классы теперь могут иметь подклассы во всех файлах одного модуля компиляции и одного пакета. Раньше все подклассы должны были появляться в одном файле.

Прямые подклассы могут быть уровня верхнего уровня или вложены внутри любого количества других именованных классов, именованных интерфейсов или именованных объектов.

Подклассы закрытого класса должны иметь надлежаще квалифицированное имя — они не могут быть локальными или анонимными объектами.

Узнайте больше об иерархиях закрытых классов.

Встроенные классы

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

Встроенные классы могут быть объявлены с модификатором value перед именем класса:

value class Password(val s: String)

JVM-бекенд также требует специальной аннотации @JvmInline.

@JvmInline
value class Password(val s: String)

Модификатор inline теперь устарел с предупреждением.

Узнайте больше о встроенных классах.

Kotlin/JVM

Kotlin/JVM получил ряд улучшений, как внутренних, так и направленных на пользователя. Ниже приведены наиболее заметные из них:

  • Стабильный JVM IR бэкенд

  • Новая по умолчанию JVM цель: 1.8

  • SAM адаптеры через invokedynamic

  • Лямбда-выражения через invokedynamic

  • Устаревание @JvmDefault и старых режимов Xjvm-default

  • Улучшения обработки аннотаций нулевости

Стабильный JVM IR бэкенд

Базовая часть IR-основанного бэкенда для компилятора Kotlin/JVM теперь стабильна и включена по умолчанию.

Начиная с Kotlin 1.4.0, предварительные версии IR-основанного бэкенда были доступны для предварительного просмотра, и теперь он является по умолчанию для версии языка 1.5. Старый бэкенд по-прежнему используется по умолчанию для более ранних версий языка.

Дополнительные сведения о преимуществах IR-бэкенда и его дальнейшей разработке можно найти в этой публикации в блоге.

Если вам необходимо использовать старый бэкенд в Kotlin 1.5.0, можно добавить следующие строки в файл конфигурации проекта:

  • В Gradle:

tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile> {
  kotlinOptions.useOldBackend = true
}
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile) {
 kotlinOptions.useOldBackend = true
}
  • В Maven:

<configuration>
    <args>
        <arg>-Xuse-old-backend</arg>
    </args>
</configuration>

Новая по умолчанию JVM цель: 1.8

Версия цели по умолчанию для компиляций Kotlin/JVM теперь 1.8. Цель 1.6 устарела.

Если вам нужна сборка для JVM 1.6, вы всё ещё можете переключиться на эту цель. Узнайте как:

  • в Gradle

  • в Maven

  • в компиляторе командной строки

SAM адаптеры через invokedynamic

Kotlin 1.5.0 теперь использует динамические вызовы (invokedynamic) для компиляции преобразований SAM (Single Abstract Method):

  • Над любым выражением, если тип SAM — интерфейс Java

  • Над лямбдой, если тип SAM — функциональный интерфейс Kotlin

Новая реализация использует LambdaMetafactory.metafactory(), и вспомогательные оберточные классы больше не генерируются во время компиляции. Это уменьшает размер JAR приложения, что улучшает производительность запуска JVM.

Чтобы вернуться к старой схеме реализации, основанной на генерации анонимных классов, добавьте опцию компилятора -Xsam-conversions=class.

Узнайте, как добавить опции компилятора в Gradle, Maven и компилятор командной строки.

Лямбды через invokedynamic

Компиляция обычных лямбда-выражений Kotlin в invokedynamic является экспериментальной. Она может быть удалена или изменена в любое время. Требуется включение (см. подробности ниже), и вы должны использовать её только для оценки. Мы будем признательны за ваши отзывы на YouTrack.

Kotlin 1.5.0 вводит экспериментальную поддержку компиляции обычных лямбд Kotlin (которые не преобразуются в экземпляр функционального интерфейса) в динамические вызовы (invokedynamic). Реализация создаёт более лёгкие бинарники, используя LambdaMetafactory.metafactory(), которая эффективно генерирует необходимые классы во время выполнения. В настоящее время у неё есть три ограничения по сравнению с обычной компиляцией лямбд:

  • Лямбда, скомпилированная в invokedynamic, не сериализуема.

  • Вызов toString() для такой лямбды даёт менее читабельное строковое представление.

  • Экспериментальный reflect API не поддерживает лямбды, созданные с помощью LambdaMetafactory.

Чтобы попробовать эту функцию, добавьте опцию компилятора -Xlambdas=indy. Мы будем благодарны, если вы поделитесь своими отзывами об этом с помощью этого YouTrack-заявки.

Узнайте, как добавить опции компилятора в Gradle, Maven и компилятор командной строки.

Устаревание @JvmDefault и старых режимов Xjvm-default

До Kotlin 1.4.0 существовала аннотация @JvmDefault вместе с режимами -Xjvm-default=enable и -Xjvm-default=compatibility. Они использовались для создания JVM-метода по умолчанию для любого конкретного неабстрактного члена в Kotlin-интерфейсе.

В Kotlin 1.4.0 мы представили новые Xjvm-default режимы, которые включают генерацию методов по умолчанию для всего проекта.

В Kotlin 1.5.0 мы устареваем аннотацию @JvmDefault и старые режимы Xjvm-default: -Xjvm-default=enable и -Xjvm-default=compatibility.

Узнайте больше о методах по умолчанию в Java-совместимости.

Улучшения обработки аннотаций нулевости

Kotlin поддерживает обработку информации о нулевости типов из Java с помощью аннотаций нулевости. Kotlin 1.5.0 вносит ряд улучшений в эту функциональность:

  • Он читает аннотации нулевости на аргументах типа в скомпилированных Java-библиотеках, используемых как зависимости.

  • Он поддерживает аннотации нулевости с целевой версией TYPE_USE для:

    • Массивов

    • Varargs

    • Полей

    • Параметров типа и их границ

    • Аргументов типа базовых классов и интерфейсов

  • Если аннотация нулевости имеет несколько подходящих целей для типа, и одна из них — TYPE_USE, то TYPE_USE имеет приоритет. Например, сигнатура метода @Nullable String[] f() становится fun f(): Array<String?>! если @Nullable поддерживает как TYPE_USE так и METHOD в качестве целей.

Для этих новых поддерживаемых случаев использование неверного типа нулевости при вызове Java из Kotlin генерирует предупреждения. Используйте опцию компилятора -Xtype-enhancement-improvements-strict-mode для включения строгого режима для этих случаев (с сообщением об ошибке).

Узнайте больше о безопасности при работе с null и платформах.

Kotlin/Native

Kotlin/Native теперь более производительно и стабильно. Заметные изменения:

  • Улучшения производительности

  • Отключение проверки утечек памяти

Улучшения производительности

В версии 1.5.0 Kotlin/Native получило набор улучшений производительности, которые ускоряют как компиляцию, так и выполнение.

Кэши компилятора (Compiler caches) теперь поддерживаются в режиме отладки для linuxX64 (только на хостах Linux) и iosArm64 целевых платформ. При включенных кэшах компиляции, большинство отладочных компиляций завершаются значительно быстрее, за исключением первой. Измерения показали увеличение скорости на наших тестовых проектах примерно на 200%.

Чтобы использовать кэши компилятора для новых целей, включите их, добавив следующие строки в gradle.properties проекта:

  • Для linuxX64: kotlin.native.cacheKind.linuxX64=static

  • Для iosArm64: kotlin.native.cacheKind.iosArm64=static

Если вы столкнётесь с проблемами после включения кэшей компилятора, пожалуйста, сообщите о них в наш отслеживатель ошибок YouTrack.

Другие улучшения ускоряют выполнение кода Kotlin/Native:

  • Тривиальные аксессоры свойств инлайнены.

  • trimIndent() для строковых литералов вычисляется во время компиляции.

Отключение проверки утечек памяти

Встроенная проверка утечек памяти Kotlin/Native по умолчанию отключена.

Изначально она была разработана для внутреннего использования, и могла находить утечки только в ограниченном числе случаев, не во всех. Более того, позже выяснилось, что она имеет проблемы, которые могут приводить к падениям приложения. Поэтому мы решили отключить проверку утечек памяти.

Проверка утечек памяти все ещё может быть полезна в определённых случаях, например, при тестировании модулей. Для таких случаев её можно включить, добавив следующую строку кода:

Platform.isMemoryLeakCheckerActive = true

Обратите внимание, что включение проверки утечек памяти для выполнения приложения не рекомендуется.

Kotlin/JS

Kotlin/JS в версии 1.5.0 получило эволюционные изменения. Мы продолжаем работу над переносом бэкенда компилятора JS IR к стабильному состоянию и выпускаем другие обновления:

  • Обновление webpack до версии 5

  • Фреймворки и библиотеки для компилятора IR

Обновление до webpack 5

Плагин Kotlin/JS Gradle теперь использует webpack 5 для браузерных целей вместо webpack 4. Это значительное обновление webpack, которое вносит несовместимые изменения. Если вы используете пользовательскую конфигурацию webpack, обязательно ознакомьтесь с заметками о выпуске webpack 5.

Дополнительные сведения о сборке проектов Kotlin/JS с помощью webpack.

Фреймворки и библиотеки для компилятора IR

Компилятор Kotlin/JS IR находится в Альфа-стадии. Он может претерпевать несовместимые изменения и в будущем потребовать ручного переноса. Мы будем признательны за ваши отзывы на YouTrack.

Вместе с работой над бэкендом на основе IR для компилятора Kotlin/JS мы поощряем и помогаем авторам библиотек создавать свои проекты в режиме both. Это означает, что они могут создавать артефакты для обоих компиляторов Kotlin/JS, тем самым расширяя экосистему для нового компилятора.

Многие известные фреймворки и библиотеки уже доступны для бэкенда IR: KVision, fritz2, doodle и другие. Если вы используете их в своём проекте, вы уже можете скомпилировать его с бэкендом IR и увидеть преимущества, которые он предоставляет.

Если вы пишете собственную библиотеку, скомпилируйте её в режиме "both", чтобы ваши клиенты также могли использовать её с новым компилятором.

Kotlin Multiplatform

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

Новый API для получения категории символа теперь доступен в проектах multiplatform.

Стандартная библиотека

Стандартная библиотека получила ряд изменений и улучшений, от стабилизации экспериментальных частей до добавления новых функций:

  • Стабильные беззнаковые целочисленные типы

  • Стабильный API, не зависящий от локали, для перевода текста в верхний/нижний регистр

  • Стабильный API преобразования символов в целые числа

  • Стабильный API путей

  • Деление с округлением вниз и оператор mod

  • Изменения в API Duration

  • Новый API для получения категории символа теперь доступен в многоплатформенном коде

  • Новая функция коллекций firstNotNullOf()

  • Строгая версия String?.toBoolean()

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

Стабильные беззнаковые целочисленные типы

Беззнаковые целочисленные типы UInt, ULong, UByte, UShort теперь стабильны. То же самое относится к операциям над этими типами, диапазонами и прогрессиями. Беззнаковые массивы и операции над ними остаются в бета-версии.

Узнайте больше о беззнаковых целочисленных типах.

Стабильный API, не зависящий от локали, для перевода текста в верхний/нижний регистр

Этот релиз включает новый API, не зависящий от локали, для преобразования текста в верхний/нижний регистр. Он предоставляет альтернативу функциям API toLowerCase(), toUpperCase(), capitalize() и decapitalize(), которые чувствительны к локали. Новый API помогает избежать ошибок из-за различных настроек локали.

Kotlin 1.5.0 предоставляет следующие полностью стабильные альтернативы:

  • Для функций String:

    Более ранние версии

    Альтернатива 1.5.0

    String.toUpperCase()

    String.uppercase()

    String.toLowerCase()

    String.lowercase()

    String.capitalize()

    String.replaceFirstChar { it.uppercase() }

    String.decapitalize()

    String.replaceFirstChar { it.lowercase() }

  • Для функций Char:

    Более ранние версии

    Альтернатива 1.5.0

    Char.toUpperCase()

    Char.uppercaseChar(): Char
    Char.uppercase(): String

    Char.toLowerCase()

    Char.lowercaseChar(): Char
    Char.lowercase(): String

    Char.toTitleCase()

    Char.titlecaseChar(): Char
    Char.titlecase(): String

Для Kotlin/JVM также существуют перегруженные функции uppercase(), lowercase() и titlecase() с явным параметром Locale.

Старые функции API помечены как устаревшие и будут удалены в будущих версиях.

См. полный список изменений в функциях обработки текста в KEEP.

Стабильный API преобразования символов в целые числа

Начиная с Kotlin 1.5.0, новые функции преобразования символов в код и символов в цифры стабильны. Эти функции заменяют текущие функции API, которые часто путали с похожим преобразованием строк в Int.

Новый API устраняет эту путаницу в именах, делая поведение кода более прозрачным и однозначным.

Этот релиз представляет преобразования Char, которые разделены на следующие наборы функций с понятными именами:

  • Функции для получения целочисленного кода Char и для построения Char из заданного кода:

fun Char(code: Int): Char
fun Char(code: UShort): Char
val Char.code: Int
  • Функции для преобразования Char в числовое значение цифры, которую он представляет:

fun Char.digitToInt(radix: Int): Int
fun Char.digitToIntOrNull(radix: Int): Int?
  • Функция-расширение для Int для преобразования представляемой им неотрицательной однозначной цифры в соответствующее представление Char:

fun Int.digitToChar(radix: Int): Char

Старые API преобразования, включая Number.toChar() с его реализациями (все, кроме Int.toChar()) и расширения Char для преобразования в числовой тип, например Char.toInt(), теперь устарели.

Узнайте больше об API преобразования символов в целые числа в KEEP.

Стабильный API путей

Экспериментальный API путей с расширениями для java.nio.file.Path теперь стабилен.

// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"

// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")

Узнайте больше об API путей.

Деление с округлением вниз и оператор mod

В стандартную библиотеку были добавлены новые операции для модульной арифметики:

  • floorDiv() возвращает результат деления с округлением вниз. Он доступен для целочисленных типов.

  • mod() возвращает остаток от деления с округлением вниз (модуль). Он доступен для всех числовых типов.

Эти операции очень похожи на существующие деление целых чисел и функцию rem() (или оператор % ), но они работают по-разному с отрицательными числами:

  • a.floorDiv(b) отличается от обычного / тем, что floorDiv округляет результат вниз (к меньшему целому числу), тогда как / усекает результат до целого числа, ближайшего к 0.

  • a.mod(b) — это разница между a и a.floorDiv(b) * b. Он либо равен нулю, либо имеет тот же знак, что и b, тогда как a % b может иметь другой.

fun main() {
//sampleStart
    println("Floored division -5/3: ${(-5).floorDiv(3)}")
    println( "Modulus: ${(-5).mod(3)}")
    
    println("Truncated division -5/3: ${-5 / 3}")
    println( "Remainder: ${-5 % 3}")
//sampleEnd    
}

Изменения API для Duration

API Duration находится в стадии эксперимента. Он может быть удалён или изменён в любое время. Используйте его только для оценочных целей. Мы будем признательны за ваши отзывы по нему на YouTrack.

Существует экспериментальный класс Duration для представления интервалов времени в различных единицах измерения. В версии 1.5.0 API Duration претерпел следующие изменения:

  • Внутреннее представление значений теперь использует Long вместо Double для повышения точности.

  • Появился новый API для преобразования в определённую единицу измерения времени в Long. Он заменяет старый API, который работал со значениями Double и теперь устарел. Например, Duration.inWholeMinutes возвращает значение интервала, выраженное в Long, и заменяет Duration.inMinutes.

  • Появились новые вспомогательные функции для создания Duration из числа. Например, Duration.seconds(Int) создаёт объект Duration представляющий целое число секунд. Старые расширяющие свойства, такие как Int.seconds теперь устарели.

import kotlin.time.Duration
import kotlin.time.ExperimentalTime

@ExperimentalTime
fun main() {
//sampleStart
    val duration = Duration.milliseconds(120000)
    println("There are ${duration.inWholeSeconds} seconds in ${duration.inWholeMinutes} minutes")
//sampleEnd
}

Новый API для получения категории символов доступен в коде для многоплатформенных проектов

Kotlin 1.5.0 вводит новый API для получения категории символа в соответствии с Unicode в многоплатформенных проектах. Несколько функций теперь доступны на всех платформах и в общем коде.

Функции для проверки, является ли символ буквой или цифрой:

  • Char.isDigit()

  • Char.isLetter()

  • Char.isLetterOrDigit()

fun main() {
//sampleStart
    val chars = listOf('a', '1', '+')
    val (letterOrDigitList, notLetterOrDigitList) = chars.partition { it.isLetterOrDigit() }
    println(letterOrDigitList) // [a, 1]
    println(notLetterOrDigitList) // [+]
//sampleEnd    
}

Функции для проверки регистра символа:

  • Char.isLowerCase()

  • Char.isUpperCase()

  • Char.isTitleCase()

fun main() {
//sampleStart
    val chars = listOf('Dž', 'Lj', 'Nj', 'Dz', '1', 'A', 'a', '+')
    val (titleCases, notTitleCases) = chars.partition { it.isTitleCase() }
    println(titleCases) // [Dž, Lj, Nj, Dz]
    println(notTitleCases) // [1, A, a, +]
//sampleEnd    
}

Другие функции:

  • Char.isDefined()

  • Char.isISOControl()

Свойство Char.category и его перечисление типов CharCategory, указывающее общую категорию символа в соответствии с Unicode, теперь также доступны в многоплатформенных проектах.

Дополнительная информация о символах.

Новая функция для коллекций firstNotNullOf()

Новые функции firstNotNullOf() и firstNotNullOfOrNull() объединяют mapNotNull() с first() или firstOrNull(). Они отображают исходную коллекцию с пользовательской функцией выбора и возвращают первое ненулевое значение. Если такого значения нет, firstNotNullOf() вызывает исключение, а firstNotNullOfOrNull() возвращает null.

fun main() {
//sampleStart
    val data = listOf("Kotlin", "1.5")
    println(data.firstNotNullOf(String::toDoubleOrNull))
    println(data.firstNotNullOfOrNull(String::toIntOrNull))
//sampleEnd
}

Строгая версия String?.toBoolean()

Две новые функции вводят строго чувствительные к регистру версии существующей String?.toBoolean():

  • String.toBooleanStrict() выбрасывает исключение для всех вводов, кроме литералов true и false.

  • String.toBooleanStrictOrNull() возвращает null для всех вводов, кроме литералов true и false.

fun main() {
//sampleStart
    println("true".toBooleanStrict())
    println("1".toBooleanStrictOrNull())
    // println("1".toBooleanStrict()) // Exception
//sampleEnd    
}

Библиотека kotlin-test

Библиотека kotlin-test вводит некоторые новые возможности:

  • Упрощенное использование зависимостей для тестирования в многоплатформенных проектах

  • Автоматический выбор фреймворка для тестирования для наборов исходных кодов Kotlin/JVM

  • Обновления функций проверки

Упрощенное использование зависимостей для тестирования в многоплатформенных проектах

Теперь вы можете использовать зависимость kotlin-test для добавления зависимостей для тестирования в наборе исходных кодов commonTest, и плагин Gradle определит соответствующие платформенные зависимости для каждого набора исходных кодов тестов:

  • kotlin-test-junit для наборов исходных кодов JVM, см. автоматический выбор фреймворка для тестирования для наборов исходных кодов Kotlin/JVM

  • kotlin-test-js для наборов исходных кодов Kotlin/JS

  • kotlin-test-common и kotlin-test-annotations-common для общих наборов исходных кодов

  • Дополнительных артефактов для наборов исходных кодов Kotlin/Native не требуется

Кроме того, вы можете использовать зависимость kotlin-test в любом общем или платформенно-специфичном наборе исходных кодов.

Существующая настройка kotlin-test с явными зависимостями будет продолжать работать как в Gradle, так и в Maven.

Подробнее о установке зависимостей от библиотек тестов.

Автоматический выбор фреймворка для тестирования для наборов исходных кодов Kotlin/JVM

Плагин Gradle теперь автоматически выбирает и добавляет зависимость от фреймворка для тестирования. Всё, что вам нужно сделать, это добавить зависимость kotlin-test в общий набор исходных кодов.

По умолчанию Gradle использует JUnit 4. Поэтому зависимость kotlin("test") разрешается до варианта для JUnit 4, а именно kotlin-test-junit:

kotlin {
    sourceSets {
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test")) // This brings the dependency
                                               // on JUnit 4 transitively
            }
        }
    }
}
kotlin {
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin("test") // This brings the dependency 
                                              // on JUnit 4 transitively
            }
        }
    }
}

Вы можете выбрать JUnit 5 или TestNG, вызвав useJUnitPlatform() или useTestNG() в задаче тестирования:

tasks {
    test {
        // enable TestNG support
        useTestNG()
        // or
        // enable JUnit Platform (a.k.a. JUnit 5) support
        useJUnitPlatform()
    }
}

Вы можете отключить автоматический выбор фреймворка для тестирования, добавив строку kotlin.test.infer.jvm.variant=false в gradle.properties проекта.

Подробнее о установке зависимостей от библиотек тестов.

Обновления функций проверки

Этот релиз содержит новые функции проверки и улучшения существующих.

Библиотека kotlin-test теперь имеет следующие функции:

  • Проверка типа значения

    Вы можете использовать новые функции assertIs<T> и assertIsNot<T> для проверки типа значения:

    @Test
    fun testFunction() {
        val s: Any = "test"
        assertIs<String>(s)  // throws AssertionError mentioning the actual type of s if the assertion fails
        // can now print s.length because of contract in assertIs
        println("${s.length}")
    }
    

    Из-за стирания типов эта функция проверки только проверяет, является ли value значением типа List в примере ниже, и не проверяет, является ли это списком конкретного типа элемента String: assertIs<List<String>>(value).

  • Сравнение содержимого контейнера для массивов, последовательностей и произвольных итерируемых объектов

    Существует новый набор перегруженных функций assertContentEquals() для сравнения содержимого различных коллекций, которые не реализуют структурное равенство:

    @Test
    fun test() {
        val expectedArray = arrayOf(1, 2, 3)
        val actualArray = Array(3) { it + 1 }
        assertContentEquals(expectedArray, actualArray)
    }
    
  • Новые перегрузки для assertEquals() и assertNotEquals() для чисел Double и Float

    Существуют новые перегрузки для функции assertEquals(), которые позволяют сравнивать два числа Double или Float с абсолютной точностью. Значение точности задается как третий параметр функции:

     @Test
    fun test() {
        val x = sin(PI)
    
        // precision parameter
        val tolerance = 0.000001
    
        assertEquals(0.0, x, tolerance)
    }
    
  • Новые функции для проверки содержимого коллекций и элементов

    Теперь вы можете проверить, содержит ли коллекция или элемент что-то с помощью функции assertContains(). Вы можете использовать ее с коллекциями Kotlin и элементами, которые имеют оператор contains(), такие как IntRange, String, и другие:

    @Test
    fun test() {
        val sampleList = listOf<String>("sample", "sample2")
        val sampleString = "sample"
        assertContains(sampleList, sampleString)  // element in collection
        assertContains(sampleString, "amp")       // substring in string
    }
    
  • assertTrue(), assertFalse(), expect() функции теперь являются inline

    Теперь вы можете использовать их как inline-функции, поэтому вы можете вызывать отложенные функции внутри лямбда-выражения:

    @Test
    fun test() = runBlocking<Unit> {
        val deferred = async { "Kotlin is nice" }
        assertTrue("Kotlin substring should be present") {
            deferred.await() .contains("Kotlin")
        }
    }
    

Библиотеки kotlinx

Вместе с Kotlin 1.5.0 мы выпускаем новые версии библиотек kotlinx:

  • kotlinx.coroutines 1.5.0-RC

  • kotlinx.serialization 1.2.1

  • kotlinx-datetime 0.2.0

Coroutines 1.5.0-RC

kotlinx.coroutines 1.5.0-RC доступен с:

  • Новый API каналов

  • Стабильные реактивные интеграции

  • И многое другое

Начиная с Kotlin 1.5.0, экспериментальные coroutines отключены, а флаг -Xcoroutines=experimental больше не поддерживается.

Узнайте больше в блоге изменений и в kotlinx.coroutines блоге о релизе 1.5.0.

Serialization 1.2.1

kotlinx.serialization 1.2.1 доступен с:

  • Улучшения производительности JSON сериализации

  • Поддержка нескольких имён в JSON сериализации

  • Экспериментальная генерация схемы .proto из классов @Serializable

  • И многое другое

Узнайте больше в блоге изменений и в kotlinx.serialization блоге о релизе 1.2.1.

dateTime 0.2.0

kotlinx-datetime 0.2.0 доступен с:

  • @Serializable Объекты Datetime

  • Нормализованный API DateTimePeriod и DatePeriod

  • И многое другое

Узнайте больше в блоге изменений и в kotlinx-datetime блоге о релизе 0.2.0.

END_OF_DOCUMENT_MARKER

Миграция на Kotlin 1.5.0

IntelliJ IDEA и Android Studio предложат обновить плагин Kotlin до 1.5.0, как только он станет доступен.

Для миграции существующих проектов на Kotlin 1.5.0, просто измените версию Kotlin на 1.5.0 и повторно импортируйте свой проект Gradle или Maven. Узнайте, как обновить до Kotlin 1.5.0.

Для создания нового проекта с Kotlin 1.5.0, обновите плагин Kotlin и запустите мастер проекта из Файл | Новый | Проект.

Новый компилятор командной строки доступен для скачивания на странице выпуска GitHub.

Kotlin 1.5.0 является релиз новой версии и, следовательно, может внести несовместимые изменения в язык. Подробный список таких изменений можно найти в Руководстве по совместимости для Kotlin 1.5.

Последнее изменение: 06 сентября 2022
Что нового в Kotlin 1.5.20 Что нового в Kotlin 1.4.30

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

Spec-Zone.ru

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