Java 8 tutorial: Cơ bản về Lambda Expression

Java 8 tutorial: Cơ bản về Lambda Expression

Cuối cùng thì Lambda Expression đã xuất hiện trong phiên bản J2SE 8. Nếu đã làm qua các ngôn ngữ khác như: C#, Ruby, các bạn có thể đã biết được Lambda Expression là gì. Trong Java, xuất hiện một khái niệm mới là SAM (Single Abstract Method) hay còn gọi là Functional Interface. Functional Interface thực chất là 1 Interface với duy nhất 1 abstract method (method không có phần body). Các bạn có thể đọc bài viết Functional Interface ở đây. Vậy có thể hiểu Lambda Expression là một cách viết ngắn gọn để implement phần body cho các Functional Interface. Để tạo một lambda expression, bạn chỉ định đầu vào parameters ở phía bên trái của operator ->, và bạn viết các câu lệnh ở phía bên kia.

Trong Java đã tồn tại rất nhiều Interface chỉ có một method như: Runnable, Comparator.. Vậy ta cũng có thể gọi đó là các Functional Interface. Hãy bắt đầu viết một ví dụ đơn giản đầu tiên với những cái sẵn có, sắp xếp 1 ArrayList dùng Comparator.

List arr = new ArrayList();
arr.add(5);
arr.add(4);
arr.add(1);
arr.add(3);

Hãy tạo 1 đối tượng Comparator theo cách bình thường:

Comparator cmp1 = new Comparator() {
	@Override
	public int compare(Integer x, Integer y) {
		return (x  y) ? 1 : 0);
	}
};

Việc sắp xếp ArrayList được thực hiện như sau:

arr.sort(cmp);

Bây giờ hãy thử dùng Lambda Expression để tạo 1 đối tượng Comparator

Comparator cmp2 = (x, y) -> {
	return (x  y) ? 1 : 0);
};

Việc sắp xếp ArrayList cũng tương tự và cho ra kết quả giống nhau

arr.sort(cmp);

Thậm chí bạn có thể viết như sau:

arr.sort((x, y) -> {return (x  y) ? 1 : 0);});

Từ ví dụ trên có thể suy ra

arr.sort((x, y) -> {return (x  y) ? 1 : 0);});

tương đương với

Comparator

Vậy có thể kết luận Lambda Expression chính là 1 Functional Interface

Cùng viết thêm 1 ví dụ không sử dụng build-in class của Java

Đầu tiên, định nghĩa ra 1 Functional Interface, interface này sẽ nhận vào 2 tham số kiểu int và trả về 1 giá trị int

package com.edward.tutorial.java8.lambda;

public interface CalculatorCommand {
	public int doCalculate(int x, int y);
}

Tiếp theo viết một lớp có phương thức nhận vào interface ở trên để thực thi:

package com.edward.tutorial.java8.lambda;

public class Calculator {
	public int calculate(int x, int y, CalculatorCommand inCommand) {
		return inCommand.doCalculate(x, y);
	}
}

Hàm Calculator.calculate sẽ trả về kết quả tùy vào việc Client hiện thực hàm CalculatorCommand.doCalculate như thế nào.

Viết 1 lớp để test:

package com.edward.tutorial.java8.lambda;

public class Lambda1 {
	public static void main(String[] args) {
		Calculator cal = new Calculator();
		int result = cal.calculate(10, 20, (x, y) -> {return x * y;});
		// 200
		System.out.println(result);
	}
}

Bây giờ thì việc mapping để hiểu được Lambda Expression hoạt động như thế nào thật đơn giản.

(Còn tiếp)

Đến đây các bạn đã có cái nhìn đầu tiên về Lambda expression. Mình rất vui nếu có thể nhận được các đóng góp các ý kiến phản hồi bằng cách comment bên dưới bài viết. Các bạn có thể tham khảo một số bài viết khác trong series Java 8 Tutorial tại đây:
Series Java Core Overview

http://www.edwardthienhoang.wordpress.com