В этой статье опишу основные нововведения в синтаксисте относительно предыдущих версий.
Полный список нововведений можно найти здесь:
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)
}