06/04/2021, 14:47

Lambda Expressions trong Java 8 - ính năng mới trong Java 8

Trong bài này chúng ta sẽ tìm hiểu về Lambda Expressions trong Java 8, đây là tính năng được thêm vào kể từ phiên bản Java SE 8 nên rất mới. 1. Lambda Expression trong Java là gì? Biểu thức lambda (Lambda Expression) là một tính năng mới được giới thiệu trong Java 8. Biểu thức lambda là một ...

Trong bài này chúng ta sẽ tìm hiểu về Lambda Expressions trong Java 8, đây là tính năng được thêm vào kể từ phiên bản Java SE 8 nên rất mới.

1. Lambda Expression trong Java là gì?

Biểu thức lambda (Lambda Expression) là một tính năng mới được giới thiệu trong Java 8. Biểu thức lambda là một hàm ẩn danh. Một hàm không có tên và không thuộc bất kỳ lớp nào. Khái niệm về biểu thức lambda lần đầu tiên được giới thiệu trong ngôn ngữ lập trình LISP.

Lợi ích khi sử dụng Lambada

Sử dụng Lambda sẽ giúp ta:

  • Cung cấp bản implement cho Functional interface.
  • Viết ít code hơn.
  • Hiệu quả hơn nhờ hỗ trợ thực hiện tuần tự (sequential) và song song (parallel) thông qua Stream API.

Không chỉ có ở Java, Lambda đã được bổ sung ở hầu hết các ngôn ngữ lập trình hiện nay như PHP, Python, C#.

Sự khác nhau giữa Lambda và Method

Một phương thức (hoặc hàm) trong Java có các phần chính sau:

  1. Tên
  2. Danh sách thông số
  3. Phần body
  4. Return.

Một biểu thức lambda trong Java có các phần chính: Biểu thức Lambda chỉ có nội dung và danh sách tham số.

  1. Không có tên - chức năng ẩn danh nên chúng tôi không quan tâm đến tên
  2. Có tham số
  3. Có phần body.
  4. Không có return - Trình biên dịch java 8 có thể suy ra kiểu trả về bằng cách kiểm tra mã. bạn không cần phải đề cập đến nó một cách rõ ràng.

2. Cú pháp tạo Lambda Expression trong Java

Để tạo một biểu thức lambda, chúng ta chỉ định các tham số đầu vào (nếu có) ở phía bên trái của toán tử lambda -> và đặt biểu thức hoặc khối câu lệnh ở phía bên phải của toán tử lambda.

Ví dụ: biểu thức lambda (x, y) -> x + y chỉ định rằng biểu thức lambda nhận hai đối số x và y và trả về tổng của chúng.

Cú pháp
(parameter_list) -> {function_body}

Chúng ta hãy cùng làm một ví dụ với cả hai cách, đó là sử dụng lambda và không sử dụng lambda để xem sự khác nhau nhé.

Không sử dụng biểu thức Lambda: Trước java 8, chúng ta đã sử dụng lớp ẩn danh ActionListener để triển khai phương thức actionPerformed.

import java.awt.*;  
import java.awt.event.*;  
public class ButtonListenerOldWay {  
    public static void main(String[] args) {  
       Frame frame=new Frame("ActionListener Before Java8");  
    
       Button b=new Button("Click Here");  
       b.setBounds(50,100,80,50);  
  
       b.addActionListener(new ActionListener(){  
          public void actionPerformed(ActionEvent e){  
    	     System.out.println("Hello World!"); 
          }  
       });  
       frame.add(b);
    
       frame.setSize(200,200);  
       frame.setLayout(null);  
       frame.setVisible(true);   
    }  
}

Bằng cách sử dụng biểu thức Lambda: Thay vì tạo lớp bên trong ẩn danh, chúng ta có thể tạo biểu thức lambda như thế này

import java.awt.*;  
public class ButtonListenerNewWay {  
   public static void main(String[] args) {  
      Frame frame=new Frame("ActionListener java8");  
     
      Button b=new Button("Click Here");  
      b.setBounds(50,100,80,50); 
  
      b.addActionListener(e -> System.out.println("Hello World!")); 
      frame.add(b);
  
      frame.setSize(200,200);  
      frame.setLayout(null);  
      frame.setVisible(true);   
   }
}

Code sẽ đơn giản và ngắn gọn hơn rất nhiều.

3. Ví dụ khác về Lambda Expression trong Java

Hãy tham khảo một vài ví dụ dưới đây để hiểu rõ hơn về cách sử dụng lambada trong ngôn ngữ Java 8.

Ví dụ 1: Lambda function không có tham số

@FunctionalInterface
interface MyFunctionalInterface {

	//A method with no parameter
    public String sayHello();
}
public class Example {

   public static void main(String args[]) {
        // lambda expression
    	MyFunctionalInterface msg = () -> {
    		return "Hello";
    	};
        System.out.println(msg.sayHello());
    }
}

Ví dụ 2: Lambda function với một tham số

@FunctionalInterface
interface MyFunctionalInterface {

	//A method with single parameter
    public int incrementByFive(int a);
}
public class Example {

   public static void main(String args[]) {
        // lambda expression with single parameter num
    	MyFunctionalInterface f = (num) -> num+5;
        System.out.println(f.incrementByFive(22));
    }
}

Ví dụ 3: Lambda function với nhiều tham số

interface StringConcat {

    public String sconcat(String a, String b);
}
public class Example {

   public static void main(String args[]) {
        // lambda expression with multiple arguments
    	StringConcat s = (str1, str2) -> str1 + str2;
        System.out.println("Result: "+s.sconcat("Hello ", "World"));
    }
}

Ví dụ 4: Tạo nhiều lambda trong vòng lặp forEach.

import java.util.*;  
public class Example{  
    public static void main(String[] args) {       
       List<String> list=new ArrayList<String>();  
       list.add("Rick");         
       list.add("Negan");       
       list.add("Daryl");         
       list.add("Glenn");         
       list.add("Carl");                
       list.forEach(          
           // lambda expression        
           (names)->System.out.println(names)         
       );     
    }  
}

Việc sử dụng biểu thức lambda trong lập trình là rất quan trọng nên hầu hết các ngôn ngữ hiện nay đều có tính năng này. Nếu bạn đang học các ngôn ngữ khác thì cũng có thể search với từ khóa lambda function + tên ngôn ngữ.

0