Kotlin lambda
Tổng quan:
Biểu thức của lambda luôn được bao bởi
{}
Nếu lambda function có bất kì param nào nó phải ở trước toán tử
->
(kiểu dữ liệu của param có thể được bỏ qua)Body của lambda function phải ở sau toán tử
->
3 cách sử dụng trên là như nhau và như các cách function reference
và function anonymous
. Cách gọi thứ 3 nhìn có vẻ khác biệt chút so với 2 cách gọi còn lại. Một điểm thêm ở đây là nếu param cuối là function thì ta có thể khai báo lambda function
bên ngoài ()
.
implicit name of a single parameter
Có thể hiểu ở đây it
là tên đại diện cho parameter duy nhất
Destructuring trong Lambdas
Trong phần Function
mình đã giới thiệu về Destructure
, áp dụng nó với Lambdas không có gì khác biệt lắm.
Ở đây ta đã destructure
entry ra 2 tham số key
và value
.
Lambda return
Ở đây ta có một một Collection
ints
gọi đến function filter()
, param của function filter()
là function có kiểu trả về là Boolean
. Ta sử dụng lambda
để thực hiện điều này. Có 2 cách để return một function:
Cách thứ nhất, giá trị của biểu thức cuối cùng trùng với return type sẽ được coi là giá trị trả về,
shouldFilter
được coi là giá trị trả về.Cách thứ hai, sử dụng Return at Labels để xác định vị trí trả về, nếu chỉ để
return shouldFilter
nó sẽ hiểu là đang return trả function bên ngoài.
Closures
Lambda, anonymous function, local function và object expression đều có thể truy cập closure
của nó (nôm na như là vùng bên ngoài khai báo nó). Nó có thể truy cập các function, biến và param được khởi tạo ở bên ngoài, không giống Java
, ta chỉ sử dụng được các biến và param ở vùng bên ngoài nếu như chúng được khai báo là final
Java
Kotlin
Function Literals
Theo mình tìm hiểu định nghĩa của Function Literals
như sau và mình thấy hợp lý: Comment
Một số ví dụ về function literal trong Kotlin
:
Tất cả m
, n
và o
đều thực hiện chức năng như nhau.
Function Literals với receiver
Nếu bạn nào đọc docs bằng tiếng anh có thể hiểu receiver object
nói đến đối tượng thực hiện extension
:
Đoạn code trên class Person
được coi là receiver object
.
Để extension class Int
một function sum()
bình thường sẽ như sau:
Vỡi việc sử dụng function literal như sau:
Inline function (Nâng cao)
Inline function được giải thích ở đây