Что нового в Kotlin 1.6.0
Kotlin 1.6.0 представляет новые возможности языка, оптимизации и улучшения существующих функций, а также множество улучшений стандартной библиотеки Kotlin.
Вы также можете найти обзор изменений в посте о выпуске.
Язык
Kotlin 1.6.0 обеспечивает стабилизацию нескольких функций языка, представленных в предварительном просмотре в предыдущем выпуске 1.5.30:
Он также включает различные улучшения вывода типов и поддержку аннотаций для параметров типа класса:
Стабильные исчерпывающие операторы when для перечислений, запечатанных и булевых объектов
Оператор исчерпывающий when содержит ветви для всех возможных типов или значений его объекта, или для некоторых типов плюс else ветвь. Он охватывает все возможные случаи, делая ваш код безопаснее.
Вскоре мы запретим неисчерпывающие when операторы, чтобы поведение стало согласованным с when выражениями. Для плавного перехода Kotlin 1.6.0 сообщает предупреждения о неисчерпывающих when операторах с объектом-перечислением, запечатанным или булевым. Эти предупреждения станут ошибками в будущих выпусках.
sealed class Contact {
data class PhoneCall(val number: String) : Contact()
data class TextMessage(val number: String) : Contact()
}
fun Contact.messageCost(): Int =
when(this) { // Error: 'when' expression must be exhaustive
is Contact.PhoneCall -> 42
}
fun sendMessage(contact: Contact, message: String) {
// Starting with 1.6.0
// Warning: Non exhaustive 'when' statements on Boolean will be
// prohibited in 1.7, add 'false' branch or 'else' branch instead
when(message.isEmpty()) {
true -> return
}
// Warning: Non exhaustive 'when' statements on sealed class/interface will be
// prohibited in 1.7, add 'is TextMessage' branch or 'else' branch instead
when(contact) {
is Contact.PhoneCall -> TODO()
}
}
См. эту запись в YouTrack для более подробного объяснения изменения и его последствий.
Стабильные приостанавливаемые функции в качестве супертипов
Реализация приостанавливаемых функциональных типов стала стабильной в Kotlin 1.6.0. Превью было доступно в 1.5.30.
Эта функция полезна при проектировании API, использующих Kotlin coroutines и принимающих приостанавливаемые функциональные типы. Теперь вы можете оптимизировать свой код, поместив желаемое поведение в отдельный класс, реализующий приостанавливаемый функциональный тип.
class MyClickAction : suspend () -> Unit {
override suspend fun invoke() { TODO() }
}
fun launchOnClick(action: suspend () -> Unit) {}
Вы можете использовать экземпляр этого класса, где ранее разрешались только лямбды и ссылки на приостанавливаемые функции: launchOnClick(MyClickAction()).
В настоящее время существуют два ограничения, обусловленные особенностями реализации:
Вы не можете смешивать обычные функциональные типы и приостанавливаемые в списке супертипов.
Вы не можете использовать несколько приостанавливаемых функциональных супертипов.
Стабильные преобразования suspend
Kotlin 1.6.0 представляет стабильные преобразования из обычных функциональных типов в приостанавливаемые. Начиная с 1.4.0, эта функция поддерживала функциональные литералы и ссылки на вызываемые объекты. С 1.6.0 она работает с любыми выражениями. В качестве аргумента вызова теперь можно передавать любое выражение подходящего обычного функционального типа, где ожидается приостановление. Компилятор автоматически выполнит неявное преобразование.
fun getSuspending(suspending: suspend () -> Unit) {}
fun suspending() {}
fun test(regular: () -> Unit) {
getSuspending { } // OK
getSuspending(::suspending) // OK
getSuspending(regular) // OK
}
Стабильное создание экземпляров классов аннотаций
Kotlin 1.5.30 ввел экспериментальную поддержку создания экземпляров классов аннотаций на платформе JVM. С 1.6.0 эта функция доступна по умолчанию как для Kotlin/JVM, так и для Kotlin/JS.
Дополнительную информацию о создании экземпляров классов аннотаций см. в этом KEEP.
Улучшенный вывод типов для рекурсивных обобщенных типов
Kotlin 1.5.30 внес улучшение в вывод типов для рекурсивных обобщенных типов, позволив выводить их аргументы типов только на основе верхних границ соответствующих параметров типа. Улучшение было доступно с опцией компилятора. В версии 1.6.0 и более поздних версиях оно включено по умолчанию.
// Before 1.5.30
val containerA = PostgreSQLContainer<Nothing>(DockerImageName.parse("postgres:13-alpine")).apply {
withDatabaseName("db")
withUsername("user")
withPassword("password")
withInitScript("sql/schema.sql")
}
// With compiler option in 1.5.30 or by default starting with 1.6.0
val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine"))
.withDatabaseName("db")
.withUsername("user")
.withPassword("password")
.withInitScript("sql/schema.sql")
Изменения в выводе типов билдеров
Вывод типов билдеров — это вид вывода типов, полезный при вызове универсальных функций билдеров. Он может выводить аргументы типов вызова с помощью информации о типах из вызовов внутри его лямбда-аргумента.
Мы вносим несколько изменений, которые приближают нас к полной стабильности вывода типов билдеров. Начиная с 1.6.0:
Вы можете делать вызовы, возвращающие экземпляр еще не выведенного типа внутри лямбды билдера, без указания опции компилятора
-Xunrestricted-builder-inference, введенной в 1.5.30.-
С
-Xenable-builder-inferenceвы можете писать свои собственные билдеры без применения аннотации@BuilderInference. С
-Xenable-builder-inferenceвывод типов билдеров автоматически активируется, если обычный вывод типов не может получить достаточную информацию о типе.
Поддержка аннотаций для параметров типа класса
Поддержка аннотаций для параметров типа класса выглядит следующим образом:
@Target(AnnotationTarget.TYPE_PARAMETER)
annotation class BoxContent
class Box<@BoxContent T> {}
Аннотации для всех параметров типа передаются в байт-код JVM, так что обработчики аннотаций могут их использовать.
Для использования в мотивационном примере см. эту запись в YouTrack.
Дополнительную информацию об аннотациях см. здесь.
Поддержка предыдущих версий API в течение более длительного периода
Начиная с Kotlin 1.6.0, мы будем поддерживать разработку для трех предыдущих версий API вместо двух, вместе с текущей стабильной версией. В настоящее время мы поддерживаем версии 1.3, 1.4, 1.5 и 1.6.
Kotlin/JVM
Для Kotlin/JVM, начиная с версии 1.6.0, компилятор может генерировать классы с байткодом, соответствующим JVM 17. Новая версия языка также включает оптимизированные делегированные свойства и повторяющиеся аннотации, которые были в нашем плане:
Повторяющиеся аннотации с сохранением в ходе выполнения для целевой JVM 1.8
Оптимизация делегированных свойств, которые вызывают get/set для данного экземпляра KProperty
Повторяющиеся аннотации с сохранением в ходе выполнения для целевой JVM 1.8
Java 8 представила повторяющиеся аннотации, которые могут применяться несколько раз к одному элементу кода. Для этого необходимо наличие двух деклараций в коде Java: самой повторяющейся аннотации, помеченной @java.lang.annotation.Repeatable, и содержащей аннотации для хранения её значений.
В Kotlin повторяющиеся аннотации требуют только @kotlin.annotation.Repeatable в декларации аннотации, чтобы сделать её повторяющейся. До версии 1.6.0 данная функция поддерживала только SOURCE сохранение и была несовместима с повторяющимися аннотациями Java. Kotlin 1.6.0 устраняет эти ограничения. @kotlin.annotation.Repeatable теперь принимает любое сохранение и делает аннотацию повторяющейся как в Kotlin, так и в Java. Повторяющиеся аннотации Java теперь также поддерживаются со стороны Kotlin.
Хотя вы можете объявить содержащую аннотацию, это необязательно. Например:
-
Если аннотация
@Tagпомечена как@kotlin.annotation.Repeatable, компилятор Kotlin автоматически генерирует класс содержащей аннотации под именем@Tag.Container:@Repeatable annotation class Tag(val name: String) // The compiler generates @Tag.Container containing annotation
-
Чтобы установить пользовательское имя для содержащей аннотации, примените
@kotlin.jvm.JvmRepeatableмета-аннотацию и передайте явно объявленный класс содержащей аннотации в качестве аргумента:@JvmRepeatable(Tags::class) annotation class Tag(val name: String) annotation class Tags(val value: Array<Tag>)
Рефлексия Kotlin теперь поддерживает как повторяющиеся аннотации Kotlin, так и Java через новую функцию KAnnotatedElement.findAnnotations().
Узнайте больше о повторяющихся аннотациях Kotlin в этом KEEP.
Оптимизация делегированных свойств, вызывающих get/set для данного экземпляра KProperty
Мы оптимизировали сгенерированный JVM байткод, исключив поле $delegate и сгенерировав непосредственный доступ к связанному свойству.
Например, в следующем коде
class Box<T> {
private var impl: T = ...
var content: T by ::impl
}
Kotlin больше не генерирует поле content$delegate. Методы доступа к свойству переменной content вызывают переменную impl непосредственно, минуя операторы getValue/setValue делегированного свойства и, таким образом, избегая необходимости в объекте ссылки на свойство типа KProperty.
Спасибо нашим коллегам из Google за реализацию!
Узнайте больше о делегированных свойствах.
Kotlin/Native
Kotlin/Native получает множество улучшений и обновлений компонентов, некоторые из них находятся на стадии предварительного просмотра:
Предварительный просмотр нового менеджера памяти
С Kotlin 1.6.0 вы можете попробовать предварительный просмотр нового менеджера памяти Kotlin/Native. Это приближает нас к устранению различий между платформами JVM и Native для предоставления согласованного опыта разработчика в многоплатформенных проектах.
Одно из заметных изменений — ленивая инициализация свойств верхнего уровня, как и в Kotlin/JVM. Свойство верхнего уровня инициализируется при первом обращении к свойству или функции верхнего уровня из того же файла. Этот режим также включает глобальную межпроцедурную оптимизацию (активна только для релизных бинарных файлов), которая удаляет избыточные проверки инициализации.
Мы недавно опубликовали статью в блоге о новом менеджере памяти. Прочтите ее, чтобы узнать о текущем состоянии нового менеджера памяти и найти примеры проектов, или перейдите сразу к инструкциям по миграции, чтобы попробовать его самостоятельно. Пожалуйста, проверьте, как новый менеджер памяти работает в ваших проектах, и поделитесь отзывами в нашем трекере проблем, YouTrack.
Поддержка Xcode 13
Kotlin/Native 1.6.0 поддерживает Xcode 13 — последнюю версию Xcode. Вы можете обновить Xcode и продолжить работу над своими Kotlin-проектами для платформ Apple.
Компиляция Windows-целей на любом хосте
Начиная с версии 1.6.0, вам не нужен Windows-хост для компиляции Windows-целей mingwX64 и mingwX86. Их можно скомпилировать на любом хосте, поддерживающем Kotlin/Native.
Обновления LLVM и линковщика
Мы переработали зависимость LLVM, используемую Kotlin/Native внутри. Это приносит различные преимущества, включая:
Обновлённая версия LLVM до 11.1.0.
Уменьшен размер зависимости. Например, на macOS он теперь составляет около 300 МБ вместо 1200 МБ в предыдущей версии.
Исключена зависимость от библиотеки
ncurses5, которая недоступна в современных дистрибутивах Linux.
В дополнение к обновлению LLVM, Kotlin/Native теперь использует линковщик LLD (линковщик из проекта LLVM) для целей MingGW. Он предоставляет различные преимущества по сравнению с ранее использовавшимся линковщиком ld.bfd и позволит улучшить производительность исполняемых файлов во время выполнения, а также поддерживать кэши компилятора для целей MinGW. Обратите внимание, что LLD требует импортных библиотек для связи с DLL. Узнайте больше в этом потоке Stack Overflow.
Улучшения производительности
Kotlin/Native 1.6.0 предоставляет следующие улучшения производительности:
Время компиляции: кэши компилятора включены по умолчанию для
linuxX64иiosArm64целей. Это ускоряет большинство компиляций в режиме отладки (кроме первой). Измерения показали увеличение скорости примерно на 200% в наших тестовых проектах. Кэши компилятора были доступны для этих целей с Kotlin 1.5.0 с дополнительными свойствами Gradle; теперь вы можете их удалить.Время выполнения: итерирование по массивам с помощью
forциклов теперь ускорилось до 12% благодаря оптимизациям в сгенерированном коде LLVM.
Единый ABI компилятора плагинов с JVM и JS IR бэкендами
В предыдущих версиях авторы плагинов компилятора должны были предоставлять отдельные артефакты для Kotlin/Native из-за различий в ABI.
Начиная с 1.6.0, плагин Kotlin Multiplatform Gradle может использовать встраиваемый jar-файл компилятора — тот, который используется для JVM и JS IR бэкендов — для Kotlin/Native. Это шаг к унификации опыта разработки плагинов компилятора, так как теперь вы можете использовать одни и те же артефакты плагина компилятора для Native и других поддерживаемых платформ.
Это предварительная версия такой поддержки, и она требует включения. Чтобы начать использование общих артефактов плагина компилятора для Kotlin/Native, добавьте следующую строку в gradle.properties: kotlin.native.useEmbeddableCompilerJar=true.
В будущем мы планируем использовать встраиваемый jar-файл компилятора для Kotlin/Native по умолчанию, поэтому для нас важно узнать, как предварительная версия работает для вас.
Если вы автор плагина компилятора, пожалуйста, попробуйте этот режим и проверьте, работает ли он для вашего плагина. В зависимости от структуры вашего плагина могут потребоваться шаги миграции. См. эту проблему YouTrack для инструкций по миграции и оставьте свои отзывы в комментариях.
Подробные сообщения об ошибках для сбоев связи klib
Компилятор Kotlin/Native теперь предоставляет подробные сообщения об ошибках для ошибок связи klib. Сообщения теперь содержат ясные описания ошибок, а также информацию о возможных причинах и способах их исправления.
Например:
-
1.5.30:
e: java.lang.IllegalStateException: IrTypeAliasSymbol expected: Unbound public symbol for public kotlinx.coroutines/CancellationException|null[0] <stack trace>
-
1.6.0:
e: The symbol of unexpected type encountered during IR deserialization: IrClassPublicSymbolImpl, kotlinx.coroutines/CancellationException|null[0]. IrTypeAliasSymbol is expected. This could happen if there are two libraries, where one library was compiled against the different version of the other library than the one currently used in the project. Please check that the project configuration is correct and has consistent versions of dependencies. The list of libraries that depend on "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-macosx64)" and may lead to conflicts: <list of libraries and potential version mismatches> Project dependencies: <dependencies tree>
Переработанный API обработки необработанных исключений
Мы унифицировали обработку необработанных исключений во всем времени выполнения Kotlin/Native и выделили стандартную обработку как функцию processUnhandledException(throwable: Throwable) для использования сторонними средами выполнения, такими как kotlinx.coroutines. Эта обработка также применяется к исключениям, которые выходят за пределы обработки в Worker.executeAfter(), но только для нового менеджера памяти.
Улучшения API также затронули обработчики, которые были установлены setUnhandledExceptionHook(). Ранее такие обработчики сбрасывались после того, как время выполнения Kotlin/Native вызывало обработчик с необработанным исключением, и программа всегда завершалась сразу после этого. Теперь эти обработчики могут использоваться более одного раза, и если вы хотите, чтобы программа всегда завершалась при возникновении необработанного исключения, либо не устанавливайте обработчик необработанных исключений (setUnhandledExceptionHook()), либо убедитесь, что вызываете terminateWithUnhandledException() в конце своего обработчика. Это поможет вам отправлять исключения в стороннюю службу отслеживания сбоев (например, Firebase Crashlytics), а затем завершать программу. Исключение, которое выходит за пределы обработки в main(), и исключения, пересекающие границу взаимодействия, всегда будут завершать программу, даже если обработчик не вызвал terminateWithUnhandledException().
Kotlin/JS
Мы продолжаем работу над стабилизацией бэкенда IR для компилятора Kotlin/JS. Kotlin/JS теперь имеет возможность отключить загрузку Node.js и Yarn.
Возможность использования предварительно установленных Node.js и Yarn
Теперь вы можете отключить загрузку Node.js и Yarn при построении проектов Kotlin/JS и использовать уже установленные экземпляры на хосте. Это полезно для построения на серверах без подключения к интернету, таких как сервера CI.
Чтобы отключить загрузку внешних компонентов, добавьте следующие строки в ваш build.gradle(.kts):
-
Yarn:
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> { rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().download = false // or true for default behavior }rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) { rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).download = false } -
Node.js:
rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin> { rootProject.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>().download = false // or true for default behavior }rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin) { rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension).download = false }
Плагин Kotlin Gradle
В Kotlin 1.6.0 мы изменили уровень устаревания класса KotlinGradleSubplugin на 'ERROR'. Этот класс использовался для написания плагинов компилятора. В последующих выпусках мы удалим этот класс. Используйте класс KotlinCompilerPluginSupportPlugin вместо него.
Мы удалили опцию сборки kotlin.useFallbackCompilerSearch и опции компилятора noReflect и includeRuntime. Опция компилятора useIR скрыта и будет удалена в будущих выпусках.
Узнайте больше о поддерживаемых в настоящее время опциях компилятора в плагине Kotlin Gradle.
Стандартная библиотека
Новая версия стандартной библиотеки 1.6.0 стабилизирует экспериментальные функции, добавляет новые и унифицирует свое поведение на разных платформах:
Новые функции readline
Kotlin 1.6.0 предлагает новые функции для обработки стандартного ввода: readln() и readlnOrNull().
Предыдущие версии |
Альтернатива 1.6.0 |
Использование |
|---|---|---|
|
|
Считывает строку из стандартного ввода и возвращает её, или генерирует исключение |
|
|
Считывает строку из стандартного ввода и возвращает её, или возвращает |
Мы считаем, что устранение необходимости использования !! при чтении строки улучшит опыт для новичков и упростит обучение Kotlin. Для того, чтобы название операции чтения строки было согласованно с ее println() аналогом, мы решили сократить названия новых функций до 'ln'.
println("What is your nickname?")
val nickname = readln()
println("Hello, $nickname!")
fun main() {
//sampleStart
var sum = 0
while (true) {
val nextLine = readlnOrNull().takeUnless {
it.isNullOrEmpty()
} ?: break
sum += nextLine.toInt()
}
println(sum)
//sampleEnd
}
Существующая функция readLine() будет иметь более низкий приоритет, чем readln() и readlnOrNull() в автодополнении вашего IDE. Инспекции IDE также будут рекомендовать использование новых функций вместо устаревшей функции readLine().
В будущих релизах мы планируем постепенно убирать функцию readLine().
Стабильная функция typeOf()
Версия 1.6.0 включает стабильную функцию typeOf(), закрывая одну из основных задач дорожной карты.
С 1.3.40, функция typeOf() была доступна на платформе JVM в качестве экспериментального API. Теперь вы можете использовать её на любой платформе Kotlin и получить KType представление любого типа Kotlin, который может определить компилятор:
inline fun <reified T> renderType(): String {
val type = typeOf<T>()
return type.toString()
}
fun main() {
val fromExplicitType = typeOf<Int>()
val fromReifiedType = renderType<List<Int>>()
}
Стабильные билдеры коллекций
В Kotlin 1.6.0 функции билдера коллекций были переведены в стабильный статус. Коллекции, возвращаемые билдерами коллекций, теперь сериализуемы в их состоянии только для чтения.
Теперь вы можете использовать buildMap(), buildList() и buildSet() без аннотации opt-in:
fun main() {
//sampleStart
val x = listOf('b', 'c')
val y = buildList {
add('a')
addAll(x)
add('d')
}
println(y) // [a, b, c, d]
//sampleEnd
}
Стабильный API Duration
Класс Duration для представления продолжительности во времени в различных единицах измерения был переведён в стабильный статус. В 1.6.0 API Duration претерпел следующие изменения:
Первый компонент функции
toComponents(), которая разбивает продолжительность на дни, часы, минуты, секунды и наносекунды, теперь имеет типLongвместоInt. Раньше, если значение не вписывалось в диапазонInt, оно приводилось к этому диапазону. С типомLong, вы можете разбить любое значение в диапазоне продолжительности без усечения значений, не вписывающихся вInt.Перечисление
DurationUnitтеперь является самостоятельным, а не псевдонимом дляjava.util.concurrent.TimeUnitна платформе JVM. Мы не нашли убедительных случаев, в которых использованиеtypealias DurationUnit = TimeUnitбыло бы полезным. Кроме того, экспонирование APITimeUnitчерез псевдоним может ввести в заблуждение пользователейDurationUnit.-
В ответ на отзывы сообщества, мы возвращаем расширяющие свойства, такие как
Int.seconds. Но мы хотим ограничить их применимость, поэтому поместили их в компаньон классаDuration. Хотя IDE по-прежнему может предлагать расширения в автодополнении и автоматически вставлять импорт из компаньона, в будущем мы планируем ограничить это поведение случаями, когда ожидается типDuration.import kotlin.time.Duration.Companion.seconds fun main() { //sampleStart val duration = 10000 println("There are ${duration.seconds.inWholeMinutes} minutes in $duration seconds") // There are 166 minutes in 10000 seconds //sampleEnd }Мы рекомендуем заменить ранее введённые вспомогательные функции, такие как
Duration.seconds(Int), и устаревшие расширяющие функции верхнего уровня, такие какInt.seconds, на новые расширения вDuration.Companion.
Разбиение регулярных выражений на последовательность
Функции Regex.splitToSequence(CharSequence) и CharSequence.splitToSequence(Regex) переведены в стабильный статус. Они разбивают строку по совпадениям с заданным регулярным выражением, но возвращают результат как последовательность, так что все операции над этим результатом выполняются лениво:
fun main() {
//sampleStart
val colorsText = "green, red, brown&blue, orange, pink&green"
val regex = "[,\\s]+".toRegex()
val mixedColor = regex.splitToSequence(colorsText)
// or
// val mixedColor = colorsText.splitToSequence(regex)
.onEach { println(it) }
.firstOrNull { it.contains('&') }
println(mixedColor) // "brown&blue"
//sampleEnd
}
Операции циклического сдвига битов для целых чисел
В Kotlin 1.6.0 функции rotateLeft() и rotateRight() для битовых манипуляций стали стабильными. Функции вращают бинарное представление числа влево или вправо на заданное количество битов:
fun main() {
//sampleStart
val number: Short = 0b10001
println(number
.rotateRight(2)
.toString(radix = 2)) // 100000000000100
println(number
.rotateLeft(2)
.toString(radix = 2)) // 1000100
//sampleEnd
}
Изменения для replace() и replaceFirst() в JS
До Kotlin 1.6.0 функции replace() и replaceFirst() Regex работали по-разному в Java и JS, когда строка замены содержала ссылку на группу. Чтобы обеспечить согласованное поведение на всех целевых платформах, мы изменили их реализацию в JS.
Вхождения ${name} или $index в строке замены заменяются подстроками, соответствующими захваченным группам с указанным индексом или именем:
$index– первая цифра после '$' всегда обрабатывается как часть ссылки на группу. Последующие цифры включаются вindexтолько в том случае, если они образуют корректную ссылку на группу. Только цифры '0'–'9' рассматриваются как потенциальные компоненты ссылки на группу. Обратите внимание, что индексы захваченных групп начинаются с '1'. Группа с индексом '0' соответствует всему совпадению.-
${name}– имяnameможет состоять из латинских букв 'a'–'z', 'A'–'Z' или цифр '0'–'9'. Первый символ должен быть буквой. -
Чтобы включить следующий символ как литерал в строку замены, используйте обратную косую черту
\:fun main() { //sampleStart println(Regex("(.+)").replace("Kotlin", """\$ $1""")) // $ Kotlin println(Regex("(.+)").replaceFirst("1.6.0", """\\ $1""")) // \ 1.6.0 //sampleEnd }Вы можете использовать
Regex.escapeReplacement(), если строка замены должна обрабатываться как строка-литерал.
Улучшения существующего API
-
Версия 1.6.0 добавила инфиксную расширяющую функцию для
Comparable.compareTo(). Теперь вы можете использовать инфиксную форму для сравнения двух объектов по порядку:class WrappedText(val text: String) : Comparable<WrappedText> { override fun compareTo(other: WrappedText): Int = this.text compareTo other.text } Regex.replace()в JS теперь также не является встроенной, чтобы унифицировать его реализацию на всех платформах.Функции строк
compareTo()иequals(), а также функцияisBlank()CharSequence теперь в JS работают точно так же, как и на JVM. Раньше были различия при работе с символами, не являющимися ASCII.
Устаревшие функции
В Kotlin 1.6.0 мы начинаем цикл устаревания с предупреждением для некоторых JS-специфичных API stdlib.
Функции строк concat(), match() и matches()
Для конкатенации строки со строковым представлением данного объекта используйте
plus()вместоconcat().Для поиска всех вхождений регулярного выражения в входных данных используйте метод
findAll()класса Regex вместоString.match(regex: String).Для проверки, соответствует ли регулярное выражение всему входному значению, используйте метод
matches()класса Regex вместоString.matches(regex: String).
sort() для массивов с функциями сравнения
Мы устарели функцию Array<out T>.sort() и встроенные функции ByteArray.sort(), ShortArray.sort(), IntArray.sort(), LongArray.sort(), FloatArray.sort(), DoubleArray.sort() и CharArray.sort(), которые сортировали массивы в соответствии с порядком, заданным функцией сравнения. Используйте другие функции стандартной библиотеки для сортировки массивов.
См. раздел упорядочения коллекций для справки.
Инструменты
Kover – инструмент для измерения покрытия кода Kotlin
В Kotlin 1.6.0 мы представили Kover – плагин Gradle для агентов измерения покрытия кода Kotlin для IntelliJ и JaCoCo. Он работает со всеми языковыми конструкциями, включая встроенные функции.
Узнайте больше о Kover на его GitHub репозитории или в этом видео:
Coroutines 1.6.0-RC
kotlinx.coroutines 1.6.0-RC выпущен с несколькими новыми функциями и улучшениями:
Поддержка нового менеджера памяти Kotlin/Native
Введение API диспетчера представлений, которое позволяет ограничивать параллелизм без создания дополнительных потоков
Переход от целевой версии Java 6 к Java 8
kotlinx-coroutines-testс новым переработанным API и кроссплатформенной поддержкойВведение
CopyableThreadContextElement, что предоставляет сопрограммам безопасный для потоков доступ к записи в переменныеThreadLocal
Узнайте больше в блоге изменений.
Миграция на Kotlin 1.6.0
IntelliJ IDEA и Android Studio предложат обновить плагин Kotlin до 1.6.0, как только он станет доступен.
Для миграции существующих проектов на Kotlin 1.6.0 измените версию Kotlin на 1.6.0 и повторно импортируйте свой проект Gradle или Maven. Узнайте, как обновить Kotlin до 1.6.0.
Для создания нового проекта с Kotlin 1.6.0 обновите плагин Kotlin и запустите Мастер проектов из Файл | Новый | Проект.
Новый компилятор командной строки доступен для скачивания на странице релизов на GitHub.
Kotlin 1.6.0 – релиз с новыми функциями и может содержать изменения, несовместимые с вашим кодом, написанным для предыдущих версий языка. Подробный список таких изменений см. в Руководстве по совместимости для Kotlin 1.6.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew16.html