В этой статье опишу основные нововведения в синтаксисте относительно предыдущих версий.
Полный список нововведений можно найти здесь:
https://kotlinlang.org/docs/whatsnew20.html
Context Receivers:
// Kotlin 1.x: class User( val name: String ) fun greet(user: User) { with(user) { println("Hello, $name") } } fun main() { greet(User("Alice")) } // Kotlin 2.0: // Теперь можно добавлять контексты для функций, // чтобы явно указывать их зависимости на уровне API: class User( val name: String ) context(User) fun greet() { println("Hello, $name") } fun main() { val user = User("Alice") with(user) { greet() } }
Value classes (переименованные inline-классы):
Работают аналогично, но новое название лучше отражает их суть, а также предоставлены дополнительные оптимизации при использовании таких классов на JVM
// Kotlin 1.x: inline class Name( val value: String ) // Kotlin 2.0: @JvmInline value class Name( val value: String )
Sealed Interface:
// Kotlin 1.x: sealed class Shape { class Circle( val radius: Double ) : Shape() class Square( val side: Double ) : Shape() } // Kotlin 2.0: // теперь можно делать sealed интерфейсы sealed interface Shape class Circle( val radius: Double ) : Shape class Square( val side: Double ) : Shape
Метки для лямбд и анонимных функций:
fun process( action: () -> Unit ) { action() } fun main() { process { return@process println("Лямбда с меткой") } }
Поддержка новых операций с коллекциями:
val list = listOf(1, 2, 3) val doubled = list.mapNotNull { if (it > 1) it * 2 else null }
Поддержка нового синтаксиса для сопоставления с образцом в when:
sealed class Shape class Circle( val radius: Double ) : Shape() class Square( val side: Double ) : Shape() fun describeShape(shape: Shape): String = when (shape) { is Circle -> "Circle with radius ${shape.radius}" is Square -> "Square with side ${shape.side}" }
Мультиобъявления для классов с operator:
data class Person( val name: String, val age: Int ) fun main() { val (name, age) = Person("Alice", 30) println("Name: $name, Age: $age") }
For loops и улучшения с деструктуризацией:
Теперь циклы for могут деструктурировать объекты прямо внутри тела цикла
data class Person( val name: String, val age: Int ) fun main() { val people = listOf( Person("Alice", 30), Person("Bob", 25) ) for ((name, age) in people) { println("$name is $age years old") } }
Поддержка улучшенных операторов для generics и обобщённых типов:
class Container<T>(val value: T) { operator fun plus(other: Container<T>): Container<T> { return Container(other.value) } } fun main() { val container1 = Container(10) val container2 = Container(20) println(container1 + container2) }