Thứ Năm, 25 tháng 4, 2024

Method Reference

 


Toán tử dấu hai chấm (::) trong Java được gọi là "toán tử tham chiếu phương thức" (method reference operator).

- Thường được sử dụng trong các biểu thức lambda hoặc các lớp ẩn danh để tham chiếu trực tiếp đến một phương thức đã tồn tại hoặc một constructor thay vì triển khai một phương thức mới.

- Giúp code trở nên ngắn gọn và dễ đọc hơn, đặc biệt là khi tham chiếu đến các phương thức hoặc constructor có sẵn trong thư viện hoặc trong mã nguồn đã được viết trước đó.

Cú pháp chung của toán tử dấu hai chấm là:

Classname::methodName

hoặc

ObjectName::methodName

Có ba loại chính của toán tử dấu hai chấm:

  1. Toán tử tham chiếu phương thức tĩnh (Static method reference):

    ClassName::staticMethodName
  2. Toán tử tham chiếu phương thức của một đối tượng cụ thể (Instance method reference):

    objectName::instanceMethodName
  3. Toán tử tham chiếu constructor (Constructor reference):

    ClassName::new

Ví dụ:

1.

import java.util.function.Function; public class StaticMethodReferenceExample { public static void main(String[] args) { // Lambda expression Function<Integer, String> converterLambda = (number) -> String.valueOf(number); // Method reference Function<Integer, String> converterMethodRef = String::valueOf; // Sử dụng method reference để chuyển đổi số thành chuỗi String result = converterMethodRef.apply(123); System.out.println("Result: " + result); } } }

2.

import java.util.function.Consumer; public class InstanceMethodReferenceExample { public static void main(String[] args) { // Lambda expression Consumer<String> printerLambda = (message) -> System.out.println(message); // Method reference Consumer<String> printerMethodRef = System.out::println; // Sử dụng method reference để in ra màn hình printerMethodRef.accept("Hello, world!"); } } }

3.

import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; public class ConstructorReferenceExample { public static void main(String[] args) { // Lambda expression Supplier<List<String>> listSupplierLambda = () -> new ArrayList<>(); // Constructor reference Supplier<List<String>> listSupplierMethodRef = ArrayList::new; // Sử dụng constructor reference để tạo một ArrayList mới List<String> list = listSupplierMethodRef.get(); list.add("Apple"); list.add("Banana"); System.out.println("List: " + list); } } }


4. for Vs forEach(lambda) Vs forEach(::)


import java.util.Arrays; import java.util.List; public class ThreeWaysForEachExample { public static void main(String[] args) { // Tạo một danh sách các chuỗi List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // Sử dụng vòng lặp for để duyệt qua từng phần tử trong danh sách và in ra màn hình System.out.println("Using for loop:"); for (String name : names) { System.out.println(name); } // Sử dụng phương thức forEach kết hợp với lambda expression để in ra màn hình từng phần tử trong danh sách System.out.println("\nUsing forEach with lambda expression:"); names.forEach((name) -> { System.out.println(name); }); // Sử dụng phương thức forEach kết hợp với toán tử dấu hai chấm (::) để in ra màn hình từng phần tử trong danh sách System.out.println("\nUsing forEach with method reference:"); names.forEach(System.out::println); } }

Khi chạy chương trình, kết quả của cả ba phương thức sẽ giống nhau: các chuỗi "Alice", "Bob", "Charlie" sẽ được in ra màn hình. Điều này chỉ là một ví dụ cho việc sử dụng cả ba cách để thực hiện cùng một nhiệm vụ.

Không có nhận xét nào:

Đăng nhận xét