Lý do bạn gặp khó khăn trong việc nắm bắt ý nghĩa của các giao diện chức năng chẳng hạn như những giao diện trong java.util.function
đó là các giao diện được định nghĩa ở đây không có bất kỳ ý nghĩa nào! Chúng hiện diện chủ yếu để biểu thị cấu trúc , không phải ngữ nghĩa .
Điều này không điển hình cho hầu hết các API Java. API Java điển hình, chẳng hạn như một lớp hoặc giao diện, có ý nghĩa và bạn có thể phát triển một mô hình tinh thần cho những gì nó đại diện và sử dụng cái đó để hiểu các hoạt động trên đó. Hãy xem xét java.util.List
ví dụ. A List
là vật chứa các đối tượng khác. Chúng có một trình tự và một chỉ mục. Số đối tượng có trong danh sách được trả về bởi size()
. Mỗi đối tượng có một chỉ mục trong phạm vi 0..size-1 (bao gồm). Đối tượng tại chỉ mục i có thể được truy xuất bằng cách gọi list.get(i)
. Và kể từ đó trở đi.
Các giao diện chức năng trong java.util.function
không có bất kỳ ý nghĩa nào như vậy. Thay vào đó, chúng là các giao diện chỉ thể hiện cấu trúc của một hàm, chẳng hạn như số lượng đối số, số lượng giá trị trả về và (đôi khi) liệu một đối số hoặc giá trị trả về có phải là một nguyên thủy hay không. Như vậy chúng ta có một cái gì đó giống như Function<T,R>
đại diện cho một chức năng mà phải mất một đối số duy nhất của loại T và trả về một giá trị kiểu R . Đó là nó. Chức năng đó làm gì? Chà, nó có thể làm bất cứ điều gì ... miễn là nó nhận một đối số duy nhất và trả về một giá trị duy nhất. Đó là lý do tại sao đặc tả cho Function<T,R>
không nhiều hơn "Đại diện cho một hàm chấp nhận một đối số và tạo ra một kết quả."
Rõ ràng, khi chúng ta viết mã, nó có ý nghĩa, và ý nghĩa đó phải đến từ đâu đó. Trong trường hợp của các giao diện chức năng, ý nghĩa xuất phát từ ngữ cảnh mà chúng được sử dụng. Giao diện Function<T,R>
không có ý nghĩa riêng biệt. Tuy nhiên, trong java.util.Map<K,V>
API, có những điều sau:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(các ký tự đại diện được giải thích cho ngắn gọn)
Ah, việc sử dụng Function
này là như một "chức năng ánh xạ". Cái đó làm cái gì? Trong ngữ cảnh này, nếu key
chưa có trong bản đồ, hàm ánh xạ được gọi và được trao khóa và được mong đợi tạo ra một giá trị, và cặp khóa-giá trị kết quả được chèn vào bản đồ.
Vì vậy, bạn không thể nhìn vào thông số kỹ thuật cho Function
(hoặc bất kỳ giao diện chức năng nào khác, cho vấn đề đó) và cố gắng phân biệt ý nghĩa của chúng. Bạn phải xem chúng được sử dụng ở đâu trong các API khác để hiểu ý nghĩa của chúng và ý nghĩa đó chỉ áp dụng cho ngữ cảnh đó.
Consumer
vàSupplier
Bạn cũng có thể tìm kiếm hướng dẫn choConsumer
…