Mặc dù mình đã có một bài viết giải thích về lambdas trong Kotlin. Trong quá trình làm với Kotlin, mình càng ngỡ ra nhiều điều, càng thấy ngôn ngữ lập trình kotlin có nhiều thứ hay ho.
Ngày trước, khi mình mới chuyển sang sử dụng Kotlin thay cho Java. Mình thực sự cảm thấy khó khăn, đọc mã nguồn hướng dẫn về Kotlin mà không hiểu gì cả. Nhưng rồi khi bạn đọc kỹ hơn, tìm hiểu và thực hành nhiều hơn thì mới thấy Kotlin nó tuyệt tới mức nào.
Để các bạn dễ hình dung, mình sẽ lấy ví dụ về hàm setOnClickListener
, xem cách Kotlin đơn giản hóa cách viết code như thế nào nhé.
Nội dung chính của bài viết
Viết hàm SetOnClickListener theo cách của Kotlin
Một trong những tính năng mà mình thích nhất ở Kotlin đó là nó đơn giản hóa cách viết code nhờ một số quy ước.
Ví dụ, hàm setOnClickListener
, với Java thì bạn sẽ phải viết như thế này:
public void setOnClickListener(OnClickListener l) { ... }
Nhưng với Kotlin thì nó chỉ còn có thế này:
fun setOnClickListener(l: (View) -> Unit)
Điều này sẽ tiết kiệm kha khá dòng code khi phải tạo các anonymous implementation (implement ẩn danh các interface). Đặc biệt hữu ích trong việc khởi tạo các UI component.
setOnclickListener – Các viết truyền thống
Thực ra, Kotlin nếu viết đầy đủ thì nó cũng dài phết. Nếu hàm setOnClickListener
mà viết đầy đủ trong Kotlin sẽ như sau.
view.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { toast("Hello") } })
Nhưng hầu như thằng Android Studio nó sẽ hiển thị một cảnh báo nho nhỏ, gợi ý để bạn chuyển sang viết theo kiểu lambda. Kiểu kiểu như thế này:
Khi bạn nhấn vào “Convert to lambda”, Android Studio sẽ convert đoạn code trên thành như này:
view.setOnClickListener({ v -> toast("Hello") })
Nhìn gọn đúng không? Nhưng Kotlin còn có thể gọn hơn nữa, tới mức “không tưởng”.
1. Nếu tham số cuối cùng của hàm là một hàm thì có thể đặt nó ra ngoài ngoặc
Do đó, với trường hợp đoạn code trên, chúng ta có thể trích xuất listener ra ngoài như sau:
view.setOnClickListener() { v -> toast("Hello") }
Nếu hàm có nhiều tham số, thì chúng sẽ được đặt trong ngoặc đơn, kể cả chúng là hàm.
2. Nếu một hàm chỉ có một tham số là một hàm số thì bỏ luôn ngoặc đơn cũng được.
Thay vì phải mất hai ký tự cho dấu ngoặc đơn, trường hợp này xóa quách nó đi.
view.setOnClickListener { v -> toast("Hello") }
Chính với cách viết code này mà làm mình lúc đầu cứ ngỡ mình bị ngáo, tưởng trong ngoặc nhọn là thân hàm, nhưng hóa ra lại là tham số 🙂
Nhưng vẫn chưa hết, ngôn ngữ lập trình kotlin còn có thể ngắn hơn nữa.
3. Nếu không sử dụng tham số của Lambda, có thể bỏ
Như trường hợp này, tham số v
bạn không sử dụng ở logic bên dưới thì có thể bỏ cho gọn.
view.setOnClickListener { toast("Hello") }
Nhưng nếu bạn cần sử dụng tham số v
trong logic bên dưới, kiểu như này.
view.setOnClickListener { v -> doSomething(v) }
Lúc này bạn không thể viết gọn như trên được. Thay vào đó, bạn có thể sử dụng biến “chuyên dụng”, Kotlin đặt nó là it
.
view.setOnClickListener { doSomething(it) }
Tạm kết
Bạn thấy đấy, chỉ với ví dụ về hàm setOnClickListener
mà chúng ta thấy được Kotlin hay tới mức nào.
Việc làm gọn mã nguồn không chỉ đơn giản là tiết kiệm công sức gõ code, mà tác dụng lớn nhất đó là làm cho bạn tập trung vào logic của mã nguồn, thay vì phân tán vào những dòng code không có nhiều thông tin logic.
Bạn thấy khoái thằng Kotlin này chưa? Nếu rồi thì đọc thêm mấy bài viết ngôn ngữ lập trình kotlin nữa này.
Bình luận. Cùng nhau thảo luận nhé!