Что нового в Kotlin 1.5.0
Kotlin 1.5.0 включает новые языковые возможности, стабильный IR-основанный JVM-компилятор, улучшения производительности и эволюционные изменения, такие как стабилизация экспериментальных функций и устаревание устаревших.
Вы также можете найти обзор изменений в записи блога о выпуске.
Языковые возможности
Kotlin 1.5.0 предоставляет стабильные версии новых языковых возможностей, представленных для предварительного просмотра в 1.4.30:
Подробные описания этих возможностей доступны в этой записи блога и на соответствующих страницах документации Kotlin.
Поддержка JVM-записей
Java быстро развивается, и для обеспечения совместимости Kotlin с ним мы внедрили поддержку одной из её последних функций – классы-записи.
Поддержка Kotlin для JVM-записей включает двустороннюю совместимость:
В 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.
Улучшения обработки аннотаций нулевости
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
Плагин 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 для получения категории символа теперь доступен в проектах multiplatform.
Стандартная библиотека
Стандартная библиотека получила ряд изменений и улучшений, от стабилизации экспериментальных частей до добавления новых функций:
Стабильный 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(): CharChar.uppercase(): StringChar.toLowerCase()Char.lowercaseChar(): CharChar.lowercase(): StringChar.toTitleCase()Char.titlecaseChar(): CharChar.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Объекты DatetimeНормализованный 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