Kotlin 1.2 có gì mới
Bài đăng này đã không được cập nhật trong 6 năm
Multiplatform Projects
Các dự án đa nền là một tính năng thử nghiệm mới trong Kotlin 1.2, cho phép bạn sử dụng lại mã giữa các nền tảng đích được hỗ trợ bởi Kotlin-JVM, JavaScript và (trong tương lai) Native. Một dự án đa nền tảng sẽ có ba loại module:
- common module
- platform module
- Regular module
Một tính năng chính hỗ trợ dự án đa nền tảng là khả năng thể hiện sự phụ thuộc của code chung vào các phần của nền tảng cụ thể thông qua các khai báo expected and actual Ví dụ: trong common code:
// expected platform-specific API:
expect fun hello(world: String): String
fun greet() {
// usage of the expected API:
val greeting = hello("multi-platform world")
println(greeting)
}
expect class URL(spec: String) {
open fun getHost(): String
open fun getPath(): String
}
trong JVM platform code:
actual fun hello(world: String): String =
"Hello, $world, on the JVM platform!"
// using existing platform-specific implementation:
actual typealias URL = java.net.URL
Other Language Features
- Array literals in annotations Bắt đầu với Kotlin 1.2, đối số mảng cho các annotation có thể được truyền với cú pháp mới thay vì hàm arrayOf
@CacheConfig(cacheNames = ["books", "default"])
public class BookRepositoryImpl {
// ...
}
Kiểm tra một biến var lateinit đã được khởi tạo
Bây giờ bạn có thể kiểm tra xem một lateinit var đã được khởi tạo bằng cách sử dụng isInitialized
println("isInitialized before assignment: " + this::lateinitVar.isInitialized) lateinitVar = "value"
println("isInitialized after assignment: " + this::lateinitVar.isInitialized)
Các Inline function với các tham số mặc định
inline fun <E> Iterable<E>.strings(transform: (E) -> String = { it.toString() }) = map { transform(it) } val defaultStrings = listOf(1, 2, 3).strings() val customStrings = listOf(1, 2, 3).strings { "($it)" }
Thông tin từ ép kiểu rõ ràng được sử dụng cho suy luận kiểu
Trình biên dịch Kotlin bây giờ có thể sử dụng thông tin từ các ép kiểu trong suy luận kiểu.
Nếu bạn đang gọi một phương thức generic trả về một tham số kiểu T và giá trị trả về kiểu Foo ,
trình biên dịch bây giờ hiểu rằng T cho cuộc gọi này cần phải được ràng buộc với kiểu Foo .
Điều này đặc biệt quan trọng đối với các nhà phát triển Android vì trình biên dịch hiện có thể phân tích chính xác các lời gọi findViewById chung trong Android API cấp 26
val button = findViewById(R.id.button) as Button
Cải tiến ép kiểu thông minh
Nếu một biến được gán từ một biểu thức save call và check null, ép kiểu thông minh cũng nhận được áp dụng save call:
val firstChar = (s as? CharSequence)?.firstOrNull() if (firstChar != null) return s.count { it == firstChar }
// s: Any is smart cast to CharSequence
val firstItem = (s as? Iterable<*>)?.firstOrNull() if (firstItem != null) return s.count { it == firstItem }
// s: Any is smart cast to Iterable<*>
Ngoài ra, ép kiểu thông minh trong một lambda bây giờ cho phép biến local được sửa đổi trước khi lambda:
var x: String? = null
if (flag) x = "Yahoo!"
run {
if (x != null) {
println(x.length) // x is smart cast to String
}
}
Hỗ trợ :: foo như là một sự viết tắt cho this:: foo
Một tham chiếu có thể gọi đến một thành viên của this bây giờ có thể được viết mà không có tiếp nhận rõ ràng. Điều này cũng làm cho callable liên quan sử dụng thuận tiện hơn trong lambdas nơi bạn refer đến một bộ tiếp nhận bên ngoài.
Thư viện chuẩn
Các hiện vật thư viện chuẩn Kotlin và các gói phân chia Thư viện chuẩn Kotlin bây giờ hoàn toàn tương thích với hệ thống mô-đun Java 9 mà không tách các package (nhiều tệp tin jar khai báo các lớp trong cùng một package). Để hỗ trợ điều đó, kotlin-stdlib-jdk7 và kotlin-stdlib-jdk8 được giới thiệu, thay thế cho kotlin-stdlib-jre7 và kotlin-stdlib-jre8 .
Các khai báo trong các thư viện mới được hiển thị dưới cùng tên gói từ quan điểm của Kotlin, nhưng có các tên gói khác nhau cho Java. Do đó, chuyển sang các thư viện mới sẽ không yêu cầu bất kỳ thay đổi nào đối với code của bạn.
Một thay đổi khác được thực hiện để đảm bảo tính tương thích với hệ thống mô-đun mới là xóa các khai báo không được chấp nhận trong gói kotlin.reflect từ thư viện kotlin-reflect . Nếu bạn đang sử dụng chúng, bạn cần chuyển sang sử dụng các khai báo trong gói kotlin.reflect.full , được hỗ trợ từ Kotlin 1.1.
windowed, chunked, zipWithNext Phần mở rộng mới cho Iterable<T> , Sequence<T> , và CharSequence bao gồm các trường hợp sử dụng như buffering hoặc batch processing ( chunked ), cửa sổ trượt và computing sliding average ( windowed ), và các cặp xử lý của các mục tiếp theo ( zipWithNext ):
val items = (1..9).map { it * it }
val chunkedIntoLists = items.chunked(4)
val points3d = items.chunked(3) { (x, y, z) -> Triple(x, y, z) }
val windowed = items.windowed(4)
val slidingAverage = items.windowed(4) { it.average() }
val pairwiseDifferences = items.zipWithNext { a, b -> b - a }
Còn tiếp...
All rights reserved