12/08/2018, 14:46

Kotlin for Android: working with collections and data class

Chao xìn tất cả mọi người, hôm nay mình lại quay trở lại với loạt bài viết về Kotlin for android, dạo này mình không còn được làm việc với kotlin nữa vì nhiều lí do, việc ông to Google không đoái hoài gì đến ngôn ngữ này đã làm cho cộng đồng lập trình viên android yêu thích Kotlin khá hoang mang, ...

Chao xìn tất cả mọi người, hôm nay mình lại quay trở lại với loạt bài viết về Kotlin for android, dạo này mình không còn được làm việc với kotlin nữa vì nhiều lí do, việc ông to Google không đoái hoài gì đến ngôn ngữ này đã làm cho cộng đồng lập trình viên android yêu thích Kotlin khá hoang mang, riêng mình cũng cảm thấy "mông lung như một trò đùa", btw, mình thích thì mình code thôi ! À, luôn cho nóng, Kotlin vừa cho ra mắt phiên bản beta 1.1 mới nhất và sẽ sớm được release, các bạn có thể xem tại đây

Lan man quá, quay lại với bài viết ngày hôm nay, mình xin được giới thiệu với mọi người cách kotlin deal với collections và data class thú vị như thế nào, so, lets go !

Collections

Đối với java, chúng ta có rất nhiều phương thức để làm việc với collections, kotlin cũng vậy, việc kể kết tất cả cách phương thức ra thật chả thú vị chút nào, mình chỉ xin nói một số thứ thú vị và hay ho thôi nhé

sort

Đã bao giờ bạn phải đau đầu với những bài toán sắp xếp trong java và phải tốn khá nhiều dòng code để thực hiện một bài toán nhỏ, quên nó đi và thử với kotlin, kotlin đã cung cấp những phương thức để bạn làm việc đó, tất nhiên là với bất cứ điều kiện gì:

sắp xếp theo điều kiện

val sortedList = unsortedList.sortBy { it % 3 })

tăng dần

val sortedList = unsortedList.sort()

giảm dần

val sortedList = unsortedList.sortDescending()

hoặc thêm điều kiện

val sortedList = unsortedList.sortDescendingBy { it % 3 })

rất clear đúng không nào?

filter

Cái tên đã nó lên tất cả, thật tuyệt vời, chúng ta có thể tạo ra được rất nhiều thứ hay ho từ những phương thức mà kotlin đã tạo ra:

bỏ qua một số phần tử

val filteredList = list.drop (value)

bỏ qua có điều kiện

val filteredList = list.dropWhile { it < 3 })

hay filter như thê này

val filteredList = list.filter { it % 2 == 0 })

ngoài ra còn có filterNot, filterNotNull, slice, take, takeLast .. bla bla, rất nhiều phương thức để mọi thứ khiến mọi thứ đơn gian hơn rất nhiều

Combination of operations

Còn rất nhiều phương thức nữa nhưng trong phạm vi bài viết này mình không thể liệt kê ra hết được (tất nhiên, vì nó quá nhiều), quan trọng vẫn là cách chúng ta xử lí linh hoạt như thế nào để có thể đạt được mục tiêu với ít sự tiêu tốn nhât, kotlin đã cung cấp ra một công cụ để có thể gộp nhiều phương thức lại để thành một chuỗi truy vấn (giống sql quá ha), như thế này:

(0..viewGroup.childCount - 1)
    .map { viewGroup.getChildAt(it) }
    .filterIsInstance<ViewGroup>()
    .sortedBy { it.visibility }
    .takeWhile { it.visibility < View.GONE }

Nó quá rõ ràng để mình có thể giải thích thêm ! awesome

Data class

Mình khá là thấy phiên với cách xây dựng data class của java, quá cồng kềnh số dòng code, một data class tiêu biểu :

  private String name;
    private String surname;
    private String id;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSurname() {
        return surname;
    }
 
    public void setSurname(String surname) {
        this.surname = surname;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    @Override public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
 
        Person person = (Person) o;
 
        if (name != null ? !name.equals(person.name) : person.name != null) return false;
        if (surname != null ? !surname.equals(person.surname) : person.surname != null)
            return false;
        return id != null ? id.equals(person.id) : person.id == null;
 
    }
 
    @Override public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (surname != null ? surname.hashCode() : 0);
        result = 31 * result + (id != null ? id.hashCode() : 0);
        return result;
    }
 
    @Override public String toString() {
        return "Person{" +
                "name='" + name + ' +
                ", surname='" + surname + ' +
                ", id='" + id + ' +
                '}';
    }
}

phù, hãy xem kotlin làm gì với nó nhé:

data class Person(var name: String, var surname: String, var id: String)

awesome!

Classes destructuring and Objects copy

Chúng ta khai báo ra một đối tượng, và tạo ra những thể hiện của đối tượng đó hay sao chép chúng chỉ đơn giản chỉ mới một câu lệnh duy nhất

val person = Person("Gianh", "Tran", "123abc")
val person2 = person.copy(surname="Me")

Kết

Trên đây là những thứ mà mình cảm thấy hay ho khi dùng kotlin để deal với collections hay data class, nó không chỉ là giúp chúng ta less code, mà còn giúp ích rất nhiều trong việc maintain hay improve code hơn. Hy vọng bài viết này hữu ích với bạn ! thank for reading

0