Lambda expression và Functional Interface
1. Functional interface là gì?
Phần tiêu đề “1. Functional interface là gì?”Một functional interface là một interface chỉ có đúng một phương thức trừu tượng (abstract method). Java cung cấp sẵn nhiều functional interface phổ biến trong gói java.util.function:
import java.util.function.Function;
Function<Integer, Integer> square = x -> x * x; // nhận 1 tham số, trả về 1 giá trịSystem.out.println(square.apply(5)); // 25| Interface | Mô tả | Ví dụ |
|---|---|---|
Function<T, R> |
nhận T, trả về R |
x -> x * 2 |
Predicate<T> |
nhận T, trả về boolean |
x -> x > 0 |
Consumer<T> |
nhận T, không trả về gì |
x -> System.out.println(x) |
Supplier<T> |
không nhận gì, trả về T |
() -> "Hello" |
2. Cú pháp lambda expression
Phần tiêu đề “2. Cú pháp lambda expression”(tham số) -> biểu thức(tham số) -> { nhiều dòng lệnh; return giá trị; }Function<Integer, Integer> square = x -> x * x; // một tham số, không cần ngoặcFunction<Integer, Integer> squarePlusOne = (x) -> x * x + 1; // có ngoặc cũng đượcBiFunction<Integer, Integer, Integer> add = (a, b) -> a + b; // hai tham số
Predicate<Integer> isEven = n -> n % 2 == 0;System.out.println(isEven.test(4)); // true3. Lambda thay thế cho anonymous class
Phần tiêu đề “3. Lambda thay thế cho anonymous class”Trước Java 8, muốn truyền một “hành vi” (behavior) làm tham số phải dùng lớp ẩn danh (anonymous class) dài dòng:
// Cách cũ (anonymous class)Comparator<String> byLength = new Comparator<String>() { @Override public int compare(String a, String b) { return a.length() - b.length(); }};
// Cách mới (lambda) - gọn hơn nhiềuComparator<String> byLengthLambda = (a, b) -> a.length() - b.length();4. Method reference - ngắn gọn hơn nữa
Phần tiêu đề “4. Method reference - ngắn gọn hơn nữa”Khi lambda chỉ đơn giản gọi lại một phương thức có sẵn, có thể dùng cú pháp method reference (::) ngắn gọn hơn:
import java.util.List;
List<String> names = List.of("Chi", "An", "Binh");
names.forEach(name -> System.out.println(name)); // lambdanames.forEach(System.out::println); // method reference - tương đương, gọn hơn5. Dùng lambda với Comparator để sắp xếp
Phần tiêu đề “5. Dùng lambda với Comparator để sắp xếp”import java.util.ArrayList;import java.util.List;
List<String> names = new ArrayList<>(List.of("Chi", "An", "Binh"));
names.sort((a, b) -> a.compareTo(b)); // sắp xếp theo alphabet tăng dầnSystem.out.println(names); // [An, Binh, Chi]Tổng kết
Phần tiêu đề “Tổng kết”- Functional interface: interface chỉ có một phương thức trừu tượng, là “khuôn” cho lambda
- Lambda:
(tham số) -> biểu thức, cách viết ngắn gọn thay cho anonymous class java.util.functioncung cấp sẵnFunction,Predicate,Consumer,Supplier,…- Method reference (
::) còn gọn hơn khi lambda chỉ gọi lại một phương thức có sẵn