Java 8 - Biểu thức Lambda

Biểu thức Lambda được giới thiệu trong Java 8 và được coi là tính năng lớn nhất của Java 8. Biểu thức lambda tạo điều kiện thuận lợi cho việc lập trình hàm và đơn giản hóa việc phát triển rất nhiều.

Cú pháp

Một biểu thức lambda được đặc trưng bởi cú pháp sau.

parameter -> expression body

Sau đây là các đặc điểm quan trọng của biểu thức lambda.

  • Optional type declaration- Không cần khai báo kiểu của một tham số. Trình biên dịch có thể suy luận tương tự từ giá trị của tham số.

  • Optional parenthesis around parameter- Không cần khai báo một tham số duy nhất trong ngoặc đơn. Đối với nhiều tham số, dấu ngoặc đơn là bắt buộc.

  • Optional curly braces - Không cần sử dụng dấu ngoặc nhọn trong phần thân biểu thức nếu phần thân chứa một câu lệnh đơn.

  • Optional return keyword- Trình biên dịch tự động trả về giá trị nếu phần thân có một biểu thức duy nhất để trả về giá trị. Dấu ngoặc nhọn được yêu cầu để chỉ ra rằng biểu thức trả về một giá trị.

Ví dụ về biểu thức Lambda

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester tester = new Java8Tester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

Sau đây là những điểm quan trọng cần được xem xét trong ví dụ trên.

  • Biểu thức Lambda được sử dụng chủ yếu để xác định việc triển khai nội tuyến của một giao diện chức năng, tức là một giao diện chỉ có một phương thức duy nhất. Trong ví dụ trên, chúng tôi đã sử dụng nhiều loại biểu thức lambda khác nhau để xác định phương thức hoạt động của giao diện MathOperation. Sau đó, chúng tôi đã xác định việc triển khai sayMessage của GreetingService.

  • Biểu thức Lambda loại bỏ sự cần thiết của lớp ẩn danh và cung cấp khả năng lập trình chức năng rất đơn giản nhưng mạnh mẽ cho Java.

Phạm vi

Sử dụng biểu thức lambda, bạn có thể tham chiếu đến bất kỳ biến cuối cùng nào hoặc biến cuối cùng hiệu quả (chỉ được gán một lần). Biểu thức Lambda ném một lỗi biên dịch, nếu một biến được gán giá trị lần thứ hai.

Ví dụ về phạm vi

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> 
      System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

Hello! Mahesh