+4

Lambda Expressions tính năng mới trong java 8

Lambda expressions là một tính năng mới quan trọng trong Java 8. Lambda expressions giống class vô danh biểu diễn dưới dạng biểu thức. Chỉ bằng một biểu thức nó có thể biểu diễn thực thi cho method của functional interfaces. Functional interfaces là interface chỉ có 1 method. Lambda expressions cung cấp cách thức mới làm việc với Collection một cách đơn giản và hiệu quả, tăng hiệu năng (performance) của hệ thống chạy trong môi trường đa lõi (multicore).

Functional Interfaces

Runnable trong Java là một functional interfaces, nó chỉ có một method là Run(). ActionListener interface cũng vậy.

package java.awt.event;
import java.util.EventListener;

public interface ActionListener extends EventListener {
   public void actionPerformed(ActionEvent e);

}

Thông thường ta đặt các listenner cho component như sau.

button.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
   System.out.println("hello");
  }
 });

Với lambda expressions sẽ trở nên đơn giản hơn nhiều.

Lambda Expressions (LamExp)

button.addActionListener(e -> System.out.println("hello"));

Cấu trúc của lambda expressions

Agument list Arrow tocken Body
([Data type] [param1], [param2], [param_n]) -> {body};
  • LamExp có thể không có, có một, hoặc nhiều tham số. () -> "Framgia"; (a) -> return a\*a; (int a, int b) -> return a\*b
  • Tham số của có thể được định nghĩa kiểu một cách tường minh hoặc không cần định nghĩa kiểu. Kiểu sẽ được suy ra từ ngữ cảnh cụ thể.
  • Các tham số được đặc trong hai dấu đóng mở đơn (params), khi chỉ có một tham số thì có thể không cần đặt trong dấu đóng mở. a -> return a\*a
  • Body code của LamExp được đặt trong dấu đóng mở nhọn {body}, khi body code chỉ có một sử lý (thể hiện) thì không cần có dấu đóng mở nhọn.

LamExp qua ví dụ cụ thể

Thread

Cách thông thường khởi tạo và run một thread.

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
       System.out.println("I am a thread.");
    }
  }).start();

Sử dụng LamExp.

Thread thread = new Thread(
   () -> {System.out.println("I am a thread.");}).start();

Duyệt collection

Cách thông thường khởi tạo và run một thread.

//Khai báo và khởi tạo list các phần tử Integer.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
//Duyệt và in ra console từng phần tử của danh sách.
for(Integer n: list) {
	System.out.println(n);
}

Sử dụng LamExp.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n););

Một ví dụ phức tạp hơn là ta sử dụng interface Predicate để in các phần tử trong danh sách trên theo những tiêu chí khác nhau.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Main {

	public static void main(String [] a)  {
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

		System.out.print("Print all numbers: ");
		evaluate(list, (n)->true);// test(n) luôn return true

		System.out.print("Print no numbers: ");
		evaluate(list, (n)->false);// test(n) luôn return false

		System.out.print("Print even numbers: ");
		evaluate(list, (n)-> n%2 == 0 );// test(n) return true nếu n chẵn

		System.out.print("Print odd numbers: ");
		evaluate(list, (n)-> n%2 == 1 );// test(n) return true nếu n  lẻ

		System.out.print("Print numbers greater than 5: ");
		evaluate(list, (n)-> n > 5 );// test(n) return true nếu n > 5
	}

	public static void evaluate(List<Integer> list, Predicate<Integer> predicate) {
		for(Integer n: list)  {
			if(predicate.test(n)) {
				System.out.print(n + " ");
			}
		}
	}
}

Output như sau:

Print all numbers: 1 2 3 4 5 6 7

Print no numbers:

Print even numbers: 2 4 6

Print odd numbers: 1 3 5 7

Print numbers greater than 5: 6 7

Tài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí