Что нового в Kotlin 1.6.0
Дата выпуска: 16 ноября 2021 года
Kotlin 1.6.0 представляет новые возможности языка, оптимизации и улучшения существующих функций, а также множество улучшений стандартной библиотеки Kotlin.
Вы также можете найти обзор изменений в статье блога о выпуске.
Язык
Kotlin 1.6.0 обеспечивает стабилизацию нескольких возможностей языка, представленных в предварительном режиме в предыдущем выпуске 1.5.30:
Он также включает различные улучшения вывода типов и поддержку аннотаций для параметров типов класса:
Стабильные исчерпывающие операторы when для перечислений, sealed-классов и булевых значений
Оператор исчерпывающий when содержит ветви для всех возможных типов или значений его объекта или для некоторых типов плюс else ветвь. Он охватывает все возможные случаи, делая ваш код безопаснее.
Вскоре мы запретим неисчерпывающие when операторы, чтобы сделать поведение согласованным с when выражениями. Чтобы обеспечить плавную миграцию, Kotlin 1.6.0 сообщает предупреждения о неисчерпывающих when операторах с перечислением, sealed-классом или булевым объектом. Эти предупреждения станут ошибками в будущих выпусках.
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 |
Использование |
|---|---|---|
|
|
Читает строку из stdin и возвращает её, или выбрасывает исключение |
|
|
Читает строку из stdin и возвращает её, или возвращает |
Мы считаем, что устранение необходимости использования !! при чтении строки улучшит опыт новичков и упростит обучение 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()для последовательностей символов в JS теперь ведут себя точно так же, как и на JVM. Ранее наблюдались отклонения при работе с символами, не являющимися ASCII.
Устаревшие элементы
В Kotlin 1.6.0 мы начинаем цикл устаревания, выдав предупреждение для некоторых API JS-только 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