12/08/2018, 18:10

Taking Advantage of Kotlin part 2

Hôm nay mình sẽ tiếp tục nói về một số Kotlin tip dành cho người mới, các bạn có thể tham khảo phần 1 tại đây Add sorting and reduce boilerplate with standard extension functions Một trong những điểm nổi bật của Kotlin language đó chính là extensions hay khả năng thêm function cho bất kỳ một ...

Hôm nay mình sẽ tiếp tục nói về một số Kotlin tip dành cho người mới, các bạn có thể tham khảo phần 1 tại đây

Add sorting and reduce boilerplate with standard extension functions

Một trong những điểm nổi bật của Kotlin language đó chính là extensions hay khả năng thêm function cho bất kỳ một external classes (những class có sẵn).

Ví dụ: Nếu bạn muốn add thêm một phương thức nào đó vào ArrayList để trích xuất một list chỉ chứa số nguyên, hay chỉ chứa email, thay vì bạn phải viết 1 function riêng biệt nào đó hoặc 1 subclasses thì bạn có thể viết 1 extension function cho chính ArrayList để làm điều đó.

Sau đây là một số extensions phổ biến hay được sử dụng.

Add sorting

Bình thường khi làm việc với Java, chúng ta có thể phải viết một function dài dằng dặc chỉ để thực hiện việc sort một list nào đó, theo những tiêu trí mà chúng ta đang cần. Nhưng với Kotlin thì điều đó trở lên nhẹ nhàng và ngắn ngọn hơn nhiều, Kotlin standard library đã cung cấp sẵn function sortBy() cho chúng ta làm việc với các Mutable Lists, ArrayLists . Function sortBy() sẽ lấy 1 selector function như một parameter - Đây là một ví dụ về hàm bậc cao - higher-order function trong Kotlin, nhận một function làm một parameter. Phương thức sortBy() sẽ được lặp lại qua từng item của list đã gọi, và thực hiện selector function trên list item để có được giá trị theo tiêu trí sort nào đó. Thông thường selector function sẽ trả về một trong các trường của đổi tượng được implement Comparable interface như String, Int, ...

  1. Ta sẽ thực hiện sort một List Contacts như sau:
// Contact(firstName,  lastName)
val mContacts = mutableListOf(
                Contact("Nguyen Van", "A"),
                Contact("Pham Van", "C"),
                Contact("Le Thi", "T"),
                Contact("Hoang Thi", "M"))
  1. Thực hiện sort theo tiêu trí firstName. Bình thường với Java chúng ta cứ phải làm vòng for rồi so sánh giá trị, sau đó là hoán đổi. Nhưng với Kotlin chỉ đơn giản là:
mContacts.sortBy { it.firstName }

==>
mContacts:
                Contact("Hoang Thi", "M"),
                Contact("Le Thi", "T"),
                Contact("Nguyen Van", "A"),
                Contact("Pham Van", "C")
  1. Hoặc ta có thể thực hiện sort theo lastName:
mContacts.sortBy { it.lastName }

==>
mContacts:
               Contact("Nguyen Van", "A"),
               Contact("Pham Van", "C")
               Contact("Hoang Thi", "M"),
               Contact("Le Thi", "T")

Replace for loops with standard library extensions

Kotlin standard library hỗ trợ sẵn rất nhiều extension functions cho Collections như: Lists, Sets, hay Maps và bạn có thể thoải mái lựa chọn sao cho phù hợp với mục đích sử dụng.

Ban đầu bạn có thể chưa quen sử dụng các extentions được cung cấp sẵn nên bạn hãy cứ viết bình thường như trên Java, và Kotlin sẽ đưa ra gợi ý và bạn chỉ việc Alt + Enter và Replaced chúng:

  1. Thực hiện viết phương thức loadContacts() như bình thường chúng ta hay viết:
    private fun loadContacts(): ArrayList<Contact> {
        val contactSet = mPrefs.getStringSet(CONTACT_KEY, HashSet())
        val contacts = ArrayList<Contact>()
        for (contactString in contactSet) {
            contacts.add(Gson().fromJson(contactString, Contact::class.java))
        }
        return contacts
    }
  1. Sau khi phương thức loadContacts() được viết xong, bạn có thể nhìn thấy function của bạn được kẻ 1 light vàng, khi trỏ chuột vào đó thì sẽ có gợi ý hiện ra đại loại như Cái này có thể Replace with mapTo(){}. đó, lựa chọn nó và bạn sẽ thấy điều bất ngờ, code sẽ trở lên ngắn ngọn và dễ hiểu hơn nhờ các extentions của Kotlin, và sau đó bạn sẽ nghiện xài chúng             </div>
            
            <div class=
0