Việt Nam (Tiếng Việt) Translation
Java - Tham Chiếu Phương Thức
Chào bạn đang tìm kiếm, các nhà lập trình Java nhá! Hôm nay, chúng ta sẽ bơi lội vào một chủ đề thú vị có vẻ khá nguy hiểm ban đầu, nhưng tôi hứa rằng bạn sẽ thấy nó rất hữu ích khi đã quen thuộc. Chúng ta sẽ nói về Tham Chiếu Phương Thức trong Java. Vậy, hãy lấy ly đồ uống yêu thích của bạn, thoải mái và hãy cùng nhau bắt đầu hành trình thú vị này!
Tham Chiếu Phương Thức là gì?
Trước khi bước vào chi tiết, hãy bắt đầu với một câu hỏi đơn giản: Tham Chiếu Phương Thức là gì? Như thế nào? Tưởng tượng bạn có một người bạn rất tài năng trong việc nướng bánh quy. Thay vì giải thích toàn bộ công thức mỗi khi bạn muốn bánh quy, bạn có thể chỉ nói, "Làm điều đó với bánh quy của bạn." Đó chính là điều gì mà tham chiếu phương thức trong Java - cách viết ngắn gọn để tham chiếu đến một phương thức mà không thực thi nó.
Tham chiếu phương thức được giới thiệu trong Java 8 như một phần của tính năng lambda expressions. Chúng cung cấp cách để tham chiếu đến các phương thức hoặc hàm khởi tạo mà không gọi chúng. Đó như chỉ vào một phương thức và nói, "Sử dụng điều này khi bạn cần."
Các loại Tham Chiếu Phương Thức trong Java
Bây giờ khi chúng ta đã có hiểu biết cơ bản, hãy khám phá các loại khác nhau của tham chiếu phương thức. Có bốn loại chính:
- Tham chiếu đến phương thức tĩnh
- Tham chiếu đến phương thức của đối tượng cụ thể
- Tham chiếu đến phương thức của đối tượng bất kỳ của loại cụ thể
- Tham chiếu đến hàm khởi tạo
Hãy xem chi tiết mỗi loại này với một số ví dụ mã.
1. Tham Chiếu Phương Thức cho Phương Thức Tĩnh
Đây là loại dễ hiểu nhất. Đó là khi chúng ta tham chiếu đến một phương thức tĩnh trong một lớp. Dưới đây là một ví dụ:
import java.util.Arrays;
import java.util.List;
public class StaticMethodReference {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// Sử dụng lambda expression
numbers.forEach(number -> System.out.println(number));
// Sử dụng tham chiếu phương thức
numbers.forEach(System.out::println);
}
}
Trong ví dụ này, System.out::println
là tham chiếu phương thức đến phương thức tĩnh println
của đối tượng System.out
. Nó tương đương với lambda expression number -> System.out.println(number)
, nhưng nó ngắn gọn và dễ đọc hơn.
2. Tham Chiếu Phương Thức cho Phương Thức của Đối Tượng Cụ Thể
Loại tham chiếu phương thức này được sử dụng khi chúng ta muốn tham chiếu đến phương thức của đối tượng hiện có. Hãy xem một ví dụ:
public class InstanceMethodReference {
public void printUpperCase(String s) {
System.out.println(s.toUpperCase());
}
public static void main(String[] args) {
InstanceMethodReference imr = new InstanceMethodReference();
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Sử dụng lambda expression
names.forEach(name -> imr.printUpperCase(name));
// Sử dụng tham chiếu phương thức
names.forEach(imr::printUpperCase);
}
}
Ở đây, imr::printUpperCase
là tham chiếu phương thức đến phương thức printUpperCase
của đối tượng imr
. Nó tương đương với lambda expression name -> imr.printUpperCase(name)
.
3. Tham Chiếu Phương Thức cho Phương Thức của Đối Tượng Bất Kỳ của Loại Cụ Thể
Mục này có vẻ khó hiểu hơn, nhưng hãy kiên nhẫn! Loại tham chiếu phương thức này được sử dụng khi chúng ta muốn gọi phương thức của bất kỳ đối tượng nào của loại cụ thể. Dưới đây là một ví dụ:
import java.util.Arrays;
import java.util.List;
public class ArbitraryObjectMethodReference {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// Sử dụng lambda expression
names.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
// Sử dụng tham chiếu phương thức
names.sort(String::compareToIgnoreCase);
}
}
Trong ví dụ này, String::compareToIgnoreCase
là tham chiếu phương thức đến phương thức compareToIgnoreCase
của lớp String
. Nó tương đương với lambda expression (s1, s2) -> s1.compareToIgnoreCase(s2)
.
4. Tham Chiếu Phương Thức cho Hàm Khởi Tạo
Cuối cùng nhưng không kém phần quan trọng, chúng ta cũng có thể sử dụng tham chiếu phương thức để tham chiếu đến hàm khởi tạo. Điều này hoạt động như thế này:
import java.util.function.Supplier;
class Person {
private String name;
public Person() {
this.name = "Unknown";
}
public String getName() {
return name;
}
}
public class ConstructorMethodReference {
public static void main(String[] args) {
// Sử dụng lambda expression
Supplier<Person> personSupplier1 = () -> new Person();
// Sử dụng tham chiếu hàm khởi tạo
Supplier<Person> personSupplier2 = Person::new;
Person person1 = personSupplier1.get();
Person person2 = personSupplier2.get();
System.out.println(person1.getName()); // Output: Unknown
System.out.println(person2.getName()); // Output: Unknown
}
}
Trong ví dụ này, Person::new
là tham chiếu phương thức đến hàm khởi tạo của lớp Person
. Nó tương đương với lambda expression () -> new Person()
.
Tại Sao Sử Dụng Tham Chiếu Phương Thức?
Bây giờ, bạn có thể đang suy nghĩ, "Tại sao tôi nên mắc một chiếc tham chiếu phương thức khi tôi có thể chỉ sử dụng lambda expressions?" Câu hỏi tuyệt vời! Dưới đây là một số lý do:
- Đọc Mới: Tham chiếu phương thức thường làm cho mã trở nên dễ đọc và ngắn gọn hơn.
- Tái Sử Dụng: Chúng cho phép bạn tái sử dụng các thực thi phương thức hiện có.
- Hiệu Suất: Trong một số trường hợp, tham chiếu phương thức có thể hơi hiệu quả hơn lambda expressions.
Kết Luận
Và thế là, các bạn! Chúng ta đã bắt đầu với các khái niệm cơ bản về tham chiếu phương thức trong Java. Hãy nhớ, như học bất kỳ khái niệm mới nào, có thể cần một chút tập luyện để quen thuộc với tham chiếu phương thức. Nhưng một khi bạn đã quen, bạn sẽ thấy chúng rất hữu ích để làm cho mã của bạn gọn gàng và trữ lượng hơn.
Khi kết thúc, tôi muốn chia sẻ một câu chuyện nhỏ từ kinh nghiệm dạy học của mình. Một lần tôi có một học sinh gặp khó khăn với tham chiếu phương thức. Anh ấy liên tục nói, "Nó như cố gắng chỉ vào điều gì đó mà không sử dụng ngón tay!" Nhưng sau khi tập luyện, anh ấy đã có khoảnh khắc "Aha!" và kêu thảo, "Bây giờ tôi hiểu rồi! Nó như sử dụng remote của TV thay vì đi đến TV mỗi lần!" Và đúng là vậy – tham chiếu phương thức như những chiếc remote nhỏ cho phương thức của bạn.
Vậy, hãy tiếp tục lập trình, tập luyện và quan trọng nhất là hãy vui vẻ với Java! Hãy nhớ, mỗi chúa trịnh từng là học sinh. Chúc mừng lập trình!
Credits: Image by storyset