Các giao diện chức năng và các tham chiếu phương thức Java 8 mới bằng cách sử dụng ::
toán tử.
Java 8 có thể duy trì các tham chiếu phương thức (MyClass :: new) với các con trỏ " @ Functional Interface ". Không cần tên phương thức giống nhau, chỉ cần chữ ký phương thức giống nhau.
Thí dụ:
@FunctionalInterface
interface CallbackHandler{
public void onClick();
}
public class MyClass{
public void doClick1(){System.out.println("doClick1");;}
public void doClick2(){System.out.println("doClick2");}
public CallbackHandler mClickListener = this::doClick;
public static void main(String[] args) {
MyClass myObjectInstance = new MyClass();
CallbackHandler pointer = myObjectInstance::doClick1;
Runnable pointer2 = myObjectInstance::doClick2;
pointer.onClick();
pointer2.run();
}
}
Vì vậy, những gì chúng ta có ở đây?
- Giao diện chức năng - đây là giao diện, có chú thích hoặc không có @FeftalInterface , chỉ chứa một khai báo phương thức.
- Tham chiếu phương thức - đây chỉ là cú pháp đặc biệt, trông như thế này, objectInstance :: methodName , không hơn không kém.
- Ví dụ sử dụng - chỉ là một toán tử gán và sau đó gọi phương thức giao diện.
BẠN NÊN SỬ DỤNG TƯƠNG TÁC CHỨC NĂNG CHỈ DÀNH CHO NGƯỜI NGHE DUY NHẤT VÀ CHỈ DÀNH CHO ĐÓ!
Bởi vì tất cả các con trỏ hàm như vậy thực sự không tốt cho khả năng đọc mã và khả năng hiểu. Tuy nhiên, tham chiếu phương thức trực tiếp đôi khi có ích, ví dụ với foreach.
Có một số Giao diện chức năng được xác định trước:
Runnable -> void run( );
Supplier<T> -> T get( );
Consumer<T> -> void accept(T);
Predicate<T> -> boolean test(T);
UnaryOperator<T> -> T apply(T);
BinaryOperator<T,U,R> -> R apply(T, U);
Function<T,R> -> R apply(T);
BiFunction<T,U,R> -> R apply(T, U);
//... and some more of it ...
Callable<V> -> V call() throws Exception;
Readable -> int read(CharBuffer) throws IOException;
AutoCloseable -> void close() throws Exception;
Iterable<T> -> Iterator<T> iterator();
Comparable<T> -> int compareTo(T);
Comparator<T> -> int compare(T,T);
Đối với các phiên bản Java trước đó, bạn nên dùng thử Thư viện Guava, có chức năng và cú pháp tương tự, như Adrian Petrescu đã đề cập ở trên.
Để có nghiên cứu bổ sung, hãy xem Java 8 Chcoateet
và cảm ơn The Guy with The Hat cho đặc tả ngôn ngữ Java §15.13 .