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 ครับ