12/08/2018, 16:47

Kotlin 1.2 có gì mới

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 ...

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...

0