Что нового в Kotlin 1.5.0
Kotlin 1.5.0 вводит новые возможности языка, стабильный JVM-компилятор на основе IR, улучшения производительности и эволюционные изменения, такие как стабилизация экспериментальных функций и устаревание устаревших.
Вы также можете ознакомиться с обзором изменений в посте о выпуске.
Возможности языка
Kotlin 1.5.0 предоставляет стабильные версии новых возможностей языка, представленных для предварительного просмотра в 1.4.30:
Подробные описания этих функций доступны в этой публикации в блоге и на соответствующих страницах документации Kotlin.
Поддержка JVM-записей
Java быстро развивается, и чтобы обеспечить совместимость Kotlin с ним, мы представили поддержку одной из ее последних функций — классов-записей.
Поддержка JVM-записей в Kotlin включает двустороннюю совместимость:
В коде Kotlin вы можете использовать классы-записи Java, как обычные классы с свойствами.
Чтобы использовать класс Kotlin в качестве записи в Java-коде, сделайте его
dataклассом и пометьте его аннотацией@JvmRecord.
@JvmRecord data class User(val name: String, val age: Int)
Запечатанные интерфейсы
Теперь интерфейсы 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-бэкенд
Бэкенд на основе 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, вы всё ещё можете переключиться на эту цель. Узнайте как:
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 1.5.0 вводит экспериментальную поддержку компиляции простых Kotlin лямбд (которые не преобразуются в экземпляр функционального интерфейса) в динамические вызовы (invokedynamic). Реализация генерирует более лёгкие двоичные файлы, используя LambdaMetafactory.metafactory(), что эффективно генерирует необходимые классы во время выполнения. В настоящее время у него есть три ограничения по сравнению с обычной компиляцией лямбд:
Лямбда, скомпилированная в invokedynamic, не сериализуема.
Вызов
toString()на такой лямбде генерирует менее читабельное строковое представление.Экспериментальный
reflectAPI не поддерживает лямбды, созданные с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
Плагин Kotlin/JS Gradle теперь использует webpack 5 для браузерных целей вместо webpack 4. Это существенное обновление webpack, которое вносит несовместимые изменения. Если вы используете собственную конфигурацию webpack, обязательно проверьте примечания к выпуску webpack 5.
Дополнительная информация о сборке проектов Kotlin/JS с помощью webpack.
Фреймворки и библиотеки для компилятора IR
Вместе с работой над бэкэндом на основе IR для компилятора Kotlin/JS, мы поощряем и помогаем авторам библиотек создавать свои проекты в режиме both. Это означает, что они могут создавать артефакты как для компиляторов Kotlin/JS, тем самым развивая экосистему нового компилятора.
Многие известные фреймворки и библиотеки уже доступны для бэкэнда IR: KVision, fritz2, doodle и другие. Если вы используете их в своём проекте, вы можете уже собрать его с бэкэндом IR и увидеть преимущества, которые он даёт.
Если вы пишете свою собственную библиотеку, скомпилируйте её в режиме 'both', чтобы ваши клиенты также могли использовать её с новым компилятором.
Kotlin Multiplatform
В Kotlin 1.5.0, выбор зависимости для тестирования для каждой платформы был упрощён и теперь выполняется автоматически плагином Gradle.
Новый API для получения категории символов теперь доступен в многоплатформенных проектах.
Стандартная библиотека
Стандартная библиотека получила ряд изменений и улучшений, от стабилизации экспериментальных частей до добавления новых функций:
Стабильный API, не зависящий от локали, для перевода текста в верхний/нижний регистр
Новый API для получения категории символа теперь доступен в многоплатформенном коде
Вы можете узнать больше об изменениях в стандартной библиотеке в этом сообщении в блоге.
Стабильные беззнаковые целочисленные типы
Беззнаковые целочисленные типы 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(): StringChar.toLowerCase()Char.lowercaseChar(): Char\Char.lowercase(): StringChar.toTitleCase()Char.titlecaseChar(): Char\Char.titlecase(): String
Старые функции 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")
Деление с округлением вниз и оператор 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
Существует экспериментальный класс 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 в многоплатформенных проектах. Несколько функций теперь доступны на всех платформах и в общем коде.
Функции для проверки, является ли символ буквой или цифрой:
fun main() {
//sampleStart
val chars = listOf('a', '1', '+')
val (letterOrDigitList, notLetterOrDigitList) = chars.partition { it.isLetterOrDigit() }
println(letterOrDigitList) // [a, 1]
println(notLetterOrDigitList) // [+]
//sampleEnd
}
Функции для проверки регистра символа:
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.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/JVMkotlin-test-jsдля наборов исходных кодов Kotlin/JSkotlin-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:
Coroutines 1.5.0-RC
kotlinx.coroutines 1.5.0-RC с:
Стабильные реактивные интеграции
И многое другое
Начиная с 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.
Переход к 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.
© 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