Bỏ qua để đến nội dung

Lambda expression và Functional Interface

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"
(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ặc
Function<Integer, Integer> squarePlusOne = (x) -> x * x + 1; // có ngoặc cũng được
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b; // hai tham số
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true

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ều
Comparator<String> byLengthLambda = (a, b) -> a.length() - b.length();

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)); // lambda
names.forEach(System.out::println); // method reference - tương đương, gọn hơn

5. 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ần
System.out.println(names); // [An, Binh, Chi]
  • 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.function cung cấp sẵn Function, 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