Lambda Expressions tính năng mới trong java 8
Bài đăng này đã không được cập nhật trong 9 năm
Lambda expressions là một tính năng mới quan trọng trong Java 8. Lambda expressions giống class vô danh biểu diễn dưới dạng biểu thức. Chỉ bằng một biểu thức nó có thể biểu diễn thực thi cho method của functional interfaces. Functional interfaces là interface chỉ có 1 method. Lambda expressions cung cấp cách thức mới làm việc với Collection một cách đơn giản và hiệu quả, tăng hiệu năng (performance) của hệ thống chạy trong môi trường đa lõi (multicore).
Functional Interfaces
Runnable trong Java là một functional interfaces, nó chỉ có một method là Run(). ActionListener interface cũng vậy.
package java.awt.event;
import java.util.EventListener;
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
Thông thường ta đặt các listenner cho component như sau.
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("hello");
}
});
Với lambda expressions sẽ trở nên đơn giản hơn nhiều.
Lambda Expressions (LamExp)
button.addActionListener(e -> System.out.println("hello"));
Cấu trúc của lambda expressions
Agument list | Arrow tocken | Body |
---|---|---|
([Data type] [param1], [param2], [param_n]) |
-> |
{body}; |
- LamExp có thể không có, có một, hoặc nhiều tham số.
() -> "Framgia"
;(a) -> return a\*a
;(int a, int b) -> return a\*b
- Tham số của có thể được định nghĩa kiểu một cách tường minh hoặc không cần định nghĩa kiểu. Kiểu sẽ được suy ra từ ngữ cảnh cụ thể.
- Các tham số được đặc trong hai dấu đóng mở đơn
(params)
, khi chỉ có một tham số thì có thể không cần đặt trong dấu đóng mở.a -> return a\*a
- Body code của LamExp được đặt trong dấu đóng mở nhọn
{body}
, khi body code chỉ có một sử lý (thể hiện) thì không cần có dấu đóng mở nhọn.
LamExp qua ví dụ cụ thể
Thread
Cách thông thường khởi tạo và run một thread.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("I am a thread.");
}
}).start();
Sử dụng LamExp.
Thread thread = new Thread(
() -> {System.out.println("I am a thread.");}).start();
Duyệt collection
Cách thông thường khởi tạo và run một thread.
//Khai báo và khởi tạo list các phần tử Integer.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
//Duyệt và in ra console từng phần tử của danh sách.
for(Integer n: list) {
System.out.println(n);
}
Sử dụng LamExp.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n););
Một ví dụ phức tạp hơn là ta sử dụng interface Predicate để in các phần tử trong danh sách trên theo những tiêu chí khác nhau.
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Main {
public static void main(String [] a) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
System.out.print("Print all numbers: ");
evaluate(list, (n)->true);// test(n) luôn return true
System.out.print("Print no numbers: ");
evaluate(list, (n)->false);// test(n) luôn return false
System.out.print("Print even numbers: ");
evaluate(list, (n)-> n%2 == 0 );// test(n) return true nếu n chẵn
System.out.print("Print odd numbers: ");
evaluate(list, (n)-> n%2 == 1 );// test(n) return true nếu n lẻ
System.out.print("Print numbers greater than 5: ");
evaluate(list, (n)-> n > 5 );// test(n) return true nếu n > 5
}
public static void evaluate(List<Integer> list, Predicate<Integer> predicate) {
for(Integer n: list) {
if(predicate.test(n)) {
System.out.print(n + " ");
}
}
}
}
Output như sau:
Print all numbers: 1 2 3 4 5 6 7
Print no numbers:
Print even numbers: 2 4 6
Print odd numbers: 1 3 5 7
Print numbers greater than 5: 6 7
Tài liệu tham khảo
All rights reserved