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:
Toán tử tham chiếu phương thức tĩnh (Static method reference):
ClassName::staticMethodNameToán tử tham chiếu phương thức của một đối tượng cụ thể (Instance method reference):
objectName::instanceMethodNameToá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