Biểu thức Lambda
Biểu thức Lambda hay đơn giản là lambda là một hàm ẩn danh; một hàm không có tên. Các hàm này được chuyển ngay lập tức dưới dạng một biểu thức mà không cần khai báo. Ví dụ,
fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )
Khi bạn chạy chương trình, đầu ra sẽ là:
Xin chào!
Ở đây, một biểu thức lambda được gán cho lời chào biến. Biểu thức không chấp nhận bất kỳ tham số nào và không trả về bất kỳ giá trị nào trong chương trình này.
Sau đó, hàm (biểu thức lambda) được gọi là:
Lời chào()
Ví dụ: Lambda với các tham số và kiểu trả về
Chương trình bên dưới có một biểu thức lambda nhận hai số nguyên làm tham số và trả về tích của hai số nguyên đó.
fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )
Khi bạn chạy chương trình, đầu ra sẽ là:
27
Ở đây, biểu thức lambda là:
Lưu ý, một biểu thức lambda được đặt bên trong dấu ngoặc nhọn.
Chức năng bậc cao hơn
Koltin hỗ trợ rất tốt cho việc lập trình chức năng. Bạn có thể chuyển các hàm làm đối số cho các hàm khác. Ngoài ra, bạn có thể trả về một hàm từ các hàm khác. Các hàm này được gọi là các hàm bậc cao.
Thông thường, các biểu thức lambda được chuyển cho hàm bậc cao hơn (thay vì một hàm điển hình) để thuận tiện.
Ví dụ: Truyền Lambda đến Hàm
Hãy chuyển một biểu thức lambda cho một hàm bậc cao hơn. Đây là cách bạn có thể làm điều đó.
fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )
Khi bạn chạy chương trình, đầu ra sẽ là:
Xin chào!
Đây, callMe()
là một hàm bậc cao hơn (vì nó nhận hàm làm tham số). Tham số lời chào chấp nhận lambda được truyền vào callMe()
hàm dưới dạng:
lời chào: () -> Đơn vị
Dấu ngoặc trống gợi ý rằng, hàm ẩn danh đã truyền không chấp nhận bất kỳ tham số nào. Và, Unit
từ khóa gợi ý rằng hàm ẩn danh không trả về bất kỳ giá trị nào.
Lambdas thường được sử dụng khi làm việc với các bộ sưu tập. Và, có một số hàm tích hợp sẵn có trong thư viện tiêu chuẩn sử dụng lambdas để làm cho nhiệm vụ của chúng ta dễ dàng hơn. Bạn sẽ thấy một vài ví dụ ở đây:
Ví dụ: Hàm maxBy ()
Hàm maxBy () trả về phần tử đầu tiên mang lại giá trị lớn nhất của hàm đã cho hoặc null
nếu không có phần tử nào.
data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people.maxBy(( person -> person.age )) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )
Khi bạn chạy chương trình, đầu ra sẽ là:
Người (tên = Jack, tuổi = 34) tên: Tuổi Jack: 34
Ở đây, maxBy()
hàm lấy một danh sách các đối tượng Person và trả về đối tượng Person có tuổi tối đa.
it Keyword: Được sử dụng cho một tham số
Trong chương trình trên, biểu thức lambda chỉ chấp nhận một tham số (danh sách các đối tượng Person). Trong những trường hợp như vậy, bạn có thể tham khảo đối số bằng cách sử dụng từ khóa it
.
Bạn có thể thay thế
val selectPerson = people.maxBy ((person -> person.age))
với
val selectPerson = people.maxBy ((it.age))
trong chương trình trên.
Ví dụ: hàm maxBy () và startWith ()
Chương trình dưới đây tính toán độ tuổi tối đa của một đối tượng Person bắt đầu bằng chữ S.
Chúng tôi sẽ sử dụng hai hàm thư viện maxBy()
và startsWith()
để thực hiện nhiệm vụ này. Hàm starsWith () trả về true
nếu nó bắt đầu bằng ký tự được chỉ định được truyền làm đối số.
data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people .filter ( it.name.startsWith("S") ) .maxBy( it.age ) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )
Khi bạn chạy chương trình, đầu ra sẽ là:
Người (tên = Shane, tuổi = 22) tên: Shane tuổi: 22
Bài đọc được đề xuất
- Kotlin Closures
- Kotlin Với và áp dụng