Tìm hiểu Higher-Order Functions và Lambda trong Kotlin

402
lambda trong Kotlin là gì

Phiên bản Java 8 được release vào năm 2014 cùng với một tính năng rất quan trọng đó là Lambda expressions. 2 năm sau thì Kotlin ra đời, tất nhiên tính năng hay ho đã được Kotlin học hỏi. Vậy Lambda trong Kotlin là gì? Nó khác với lambda trong java không?

Thực ra, khái niệm lambda này có lẽ là được học hỏi từ các ngôn ngữ như Javascript hay Python. Nó gần giống với Callback trong Javascript vậy. (Xem thêm Python được sử dụng để làm gì?)

Tuy nhiên, với những người làm việc lâu năm với Java thì sẽ hơi khó “nuốt trôi” khái niệm mới này. Nhưng nó lại là một khái niệm rất quan trọng và hay sử dụng trong Kotlin.

Vì vậy, để các bạn có thể hiểu rõ về Lambda function, bài viết này mình sẽ chia sẻ những hiểu biết của mình về Lambda trong Kotlin.

Chúng ta cùng bắt đầu nhé!

Higher-Order Function là gì?

Theo định nghĩa từ chính nhà phát hành Kotlin: Higher-Order Function là kiểu function có thể sử dụng các function như một tham số hay trả về một phương thức.

Khái niệm này rất giống với khái niệm sử dụng hàm như tham số trong Javascript vậy.

Tóm lại, Higher-Order Function có hai đặc điểm chính là:

  • Có thể lấy các function làm tham số.
  • Có thể trả về một function.

Ví dụ, mình định nghĩa một function như sau:

Theo như định nghĩa hàm ở trên,  tham số của hàm passMeFunction là một hàm khác: (String) -> Unit.

Trong đó:

  • (String) nghĩa là function này có 1 tham số truyền vào là một String.
  • Unit nghĩa là function này không trả về gì cả( Giống với kiểu void trong Java vậy).

Còn đây là cách sử dụng:

Kết quả chạy chương trình sẽ như sau:

higher order functions trong kotlin

Thông qua ví dụ này, bạn đã hiểu đặc điểm cho phép truyền một function như một tham số trong một function rồi đúng không?

Giờ chúng ta sẽ làm rõ đặc điểm thứ 2: Một function có thể trả về kết quả là một function.

Giả sử chúng ta có hàm thực hiện phép tính cộng add như sau:

Sau đó chúng ta định nghĩa một hàm returnMeAddFunction không có tham số truyền vào và tại vùng trả về( sau dấu 🙂 là một hàm: ((Int, Int) -> Int): Hàm này có hai tham số truyền vào kiểu Int, trả về kết quả cũng là kiểu Int

Nhìn vào đoạn code trên, chúng ta thấy rằng: hàm returnMeAddFunction thực hiện return lại hàm add.

Còn đây là cách sử dụng:

Kết quả khi chạy chương trình như bên dưới

lambdas trong kotlin

  Clean code - Chapter 2: Tất tần tật về Function (Phần 1)
  Clean code - Chapter 2: Tất tần tật về Function (Phần 1)

Lambda trong Kotlin là gì?

Về cơ bản thì Lambda expression hay gọi tắt là lambdas là một các hàm ẩn danh (anonymous function) sử dụng hai ký tự {} mà bạn có thể coi là một giá trị.

Ta có thể truyền chúng làm tham số cho các function, trả về một lambda expression hoặc bất kỳ điều gì mà chúng ta có thể làm với một đối tượng bình thường.

Ví dụ: để tạo một lambda expression chỉ in ra dòng “Hello Lambdas!” thì viết như sau:

Và khi gọi hàm thì chúng ta gọi như một hàm bình thường.

Nếu bạn muốn truyền tham số vào hàm lambda thì làm như sau:

Nếu kiểu của tham số có thể suy ra từ ngữ cảnh (context) thì có thể bỏ qua chúng như bên dưới:

Khi bạn làm việc với thư viện Kotlin Sequence, bạn hay phải định nghĩa các hàm short function literals( một cách gọi khác của lambda expression) mà chỉ có một tham số:

Trong trường hợp đặc biệt này, Kotlin cho chúng ta hai cách viết

Function types

Trong phần tìm hiểu Higher-Order Function ở trên, chúng ta có gặp một cách định nghĩa hàm khá đặc biệt.  Phần này mình sẽ chỉ mang tính chất tổng hợp lại thôi.

Thực ra Kotlin cung cấp một số cú pháp ngắn gọn để bạn định nghĩa các loại hàm.

Ví dụ: ()->Unit: Định nghĩa một hàm không tham số nào và không trả về gì. Các viết này tương đương với cách viết void doSomeThings() { ... } trong java.

Hay (Int)->Int: Định nghĩa một hàm mà có 1 tham số kiểu Integer, và trả về kết quả là một integer. Tương đương trong Java, ta có int doSomeThings(int arg) { .... }

Với cách việc của hàm fun1, fun2 thì các bạn đều hiểu cả. Tuy với cách viết của hàm fun3 thì chắc hơi khó hiểu đúng không?

Với hàm fun3, khác với bình thường là thay vì trả về một kiểu quen thuộc như: Int, String,… hay Object thì nó lại trả về một function khác.

Tạm kết

Như vậy, qua bài viết này chúng ta đã cùng nhau tìm hiểu những khái niệm rất cơ bản về Higher-Order Functions và Lambda trong kotlin.

Với cá nhân mình thì mình không thích cách viết của Kotlin lắm. Cảm giác cứ nửa mùa. Không hẳn kiểu thoải mái như Javascript, cũng không hẳn chặt chẽ như Java.

Giờ Google đã quyết chọn Kotlin là một trong những ngôn ngữ chính cho lập trình ứng dụng Android. Đành phải cố thôi!

Xem thêm việc làm Android Developers hấp dẫn tại TopDev

TopDev via VNTALKING

  Java đang ngăn cản sự phát triển của Android và Kotlin không phải là cách giải quyết
  30 nguồn tài nguyên tuyệt vời dành cho lập trình viên Android