Java Lambda Expressions และ Functional Interface
#java13 เม.ย. 2569
Lambda คืออะไร
Lambda Expression (Java 8+) คือ anonymous function ที่เขียนได้กระชับขึ้น ใช้กับ Functional Interface (interface ที่มี abstract method เดียว)
Syntax
// รูปแบบ: (parameters) -> expression
// หรือ: (parameters) -> { statements }
// ไม่มี parameter
Runnable r = () -> System.out.println("Hello!");
// มี parameter เดียว
Consumer<String> print = name -> System.out.println(name);
// มีหลาย parameter
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
// มี body
Comparator<String> comp = (s1, s2) -> {
int result = s1.length() - s2.length();
return result;
};
Built-in Functional Interfaces
import java.util.function.*;
// Predicate<T> - รับ T คืน boolean
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
// Function<T, R> - รับ T คืน R
Function<String, Integer> length = String::length;
System.out.println(length.apply("Hello")); // 5
// Consumer<T> - รับ T ไม่คืนค่า
Consumer<String> printer = System.out::println;
printer.accept("สวัสดี");
// Supplier<T> - ไม่รับ คืน T
Supplier<String> greeting = () -> "สวัสดี";
System.out.println(greeting.get());
// BiFunction<T, U, R>
BiFunction<String, String, String> concat = (a, b) -> a + " " + b;
System.out.println(concat.apply("สวัสดี", "โลก"));
Method Reference
// Static method reference
Function<String, Integer> parse = Integer::parseInt;
// Instance method reference
Consumer<String> print = System.out::println;
// Constructor reference
Supplier<ArrayList<String>> listFactory = ArrayList::new;
// ตัวอย่างกับ Stream
List<String> names = List.of("สมชาย", "สมหญิง", "สมศักดิ์");
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
Custom Functional Interface
@FunctionalInterface
public interface Validator<T> {
boolean validate(T value);
default Validator<T> and(Validator<T> other) {
return value -> this.validate(value) && other.validate(value);
}
}
// ใช้งาน
Validator<String> notEmpty = s -> !s.isEmpty();
Validator<String> notTooLong = s -> s.length() <= 50;
Validator<String> combined = notEmpty.and(notTooLong);
System.out.println(combined.validate("สวัสดี")); // true
System.out.println(combined.validate("")); // false
Comparator
List<Person> people = new ArrayList<>(...);
// เรียงตามชื่อ
people.sort(Comparator.comparing(Person::getName));
// เรียงตามอายุ แล้วตามชื่อ
people.sort(Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getName));
// เรียงจากมากไปน้อย
people.sort(Comparator.comparingInt(Person::getAge).reversed());
สรุป
Lambda และ Functional Interface ทำให้โค้ด Java กระชับขึ้นมาก โดยเฉพาะเมื่อใช้กับ Stream API, Collections sorting และ event handling ครับ