2010-10-11 36 views
10

Tôi cần một giao diện như:Java: chung chức năng X-> Y giao diện

interface Function<X,Y> { 
    Y eval(X obj); 
} 

Có một cái gì đó như thế này trong Java đã hay tôi cần phải xác định của riêng tôi?

+1

thể trùng lặp của [Java: là có một chức năng bản đồ? ] (http://stackoverflow.com/questions/3907394/java-is-there-a-map-function) – Riduidel

+2

@Riduidel: Làm thế nào là nó cùng một câu hỏi? Đó là một câu hỏi hoàn toàn khác. – Albert

+0

Đây có lẽ là sự giám sát rõ ràng nhất khi Java được mở rộng. –

Trả lời

2

Có một built-in giao diện như thế này, mặc dù nó chỉ tương thích với Java 8 onw ards. Bạn có thể tìm thấy nó here.

Từ Javadocs:

public interface Function<T,R>

Đại diện cho một chức năng chấp nhận một đối số và tạo ra một kết quả.

Đây là giao diện chức năng có phương thức chức năng là apply(Object).

Loại Các tham số:
T - loại các đầu vào của hàm
R - loại kết quả của hàm

13

Check-out ổi, nó có một Function interface:

public interface Function<F, T> { 
    /** 
    * Applies the function to an object of type {@code F}, resulting in an object of  type {@code T}. 
    * Note that types {@code F} and {@code T} may or may not be the same. 
    * 
    * @param from the source object 
    * @return the resulting object 
    */ 
    T apply(@Nullable F from); 

    /** 
    * Indicates whether some other object is equal to this {@code Function}. This  method can return 
    * {@code true} <i>only</i> if the specified object is also a {@code Function} and, for every 
    * input object {@code o}, it returns exactly the same value. Thus, {@code 
    * function1.equals(function2)} implies that either {@code function1.apply(o)} and {@code 
    * function2.apply(o)} are both null, or {@code function1.apply(o).equals(function2.apply(o))}. 
    * 
    * <p>Note that it is always safe <i>not</i> to override {@link Object#equals}. 
    */ 
    boolean equals(@Nullable Object obj); 
} 
0

Trong thực tế, xem xét mục đích của bạn là của bạn, và không Sun/Oracle một, bạn nên xác định giao diện riêng của bạn (vì nó xác định hợp đồng bạn muốn triển khai giao diện của bạn để fullfil).

Tuy nhiên, nếu một số khung đã tồn tại với giao diện như vậy và mục đích của nó giống với của bạn, bạn có thể sử dụng định nghĩa của nó, nhưng với sự thận trọng lớn nhất.

5

Thật không may, không có điều gì trong các thư viện Java lõi. Kết quả là, nhiều thư viện xác định giao diện giống như chức năng của chúng. Nếu bạn tình cờ sử dụng một thư viện như vậy, bạn có thể sử dụng lại chức năng mà nó sử dụng.

+0

Tôi biết câu trả lời là cũ. Nhưng như của Java 8+, điều này là có thể. https://www.leveluplunch.com/java/examples/java-util-function-function-example/ – Eternalcode

2

Bạn có thể sử dụng một thư viện như Apache Commons Functor trong đó có chức năng hữu ích như:

UnaryFunction

T evaluate(A obj); 

BinaryFunction

T evaluate(L left, R right); 
Các vấn đề liên quan