Spec-Zone.ru › Kotlin 1.6

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

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

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

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

Возможности языка

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

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

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

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

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

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

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

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

  • В коде 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

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

Стабильный 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 interop.

Улучшения обработки аннотаций для указания возможности null

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

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

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

    • Массивов

    • Varargs

    • Полей

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

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

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

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

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

Kotlin/Native

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

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

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

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

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

Теперь поддерживаются кэши компилятора в отладочном режиме для 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 для получения категории символов теперь доступен в многоплатформенных проектах.

END_OF_DOCUMENT_MARKER

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

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

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

  • Стабильный 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")

Узнайте больше о Path 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 Объекты даты и времени

  • Нормализованный 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.

Последнее изменение: 07 апреля 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