2010-10-11 19 views
10

ho bisogno di un'interfaccia simile:Java: funzione generale X-> Y interfaccia

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

C'è qualcosa di simile in Java già o ho bisogno di definire la mia?

+1

possibile duplicato di [Java: c'è una funzione di mappa? ] (http://stackoverflow.com/questions/3907394/java-is-there-a-map-function) – Riduidel

+2

@Riduidel: Com'è la stessa domanda? È una domanda completamente diversa. – Albert

+0

Questa è forse la più evidente svista quando Java è stato generato. –

risposta

2

v'è un built-in di interfaccia in questo modo, sebbene sia compatibile solo con Java 8 onw ARDS. Lo puoi trovare here.

Dalle Javadocs:

public interface Function<T,R>

rappresenta una funzione che accetta un argomento e produce un risultato.

Questa è un'interfaccia funzionale il cui metodo funzionale è apply(Object).

Tipo Parametri:
T - il tipo di input per la funzione
R - il tipo del risultato della funzione

13

Partenza Guava, ha una 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

Infatti, considerando il vostro scopo è tuo, e non Sun/Oracle uno, si dovrebbe definire la propria interfaccia (come si definisce il contratto vuoi implementors della tua interfaccia per fullfil).

Tuttavia, se esiste già un framework con tale interfaccia e il suo scopo è uguale al tuo, è possibile utilizzare la sua definizione, ma con la massima cautela.

5

Sfortunatamente, non c'è nulla di simile nelle librerie Java principali. Di conseguenza, molte librerie definiscono la propria interfaccia simile a una funzione. Se si utilizza già tale libreria, è possibile riutilizzare la funzione che utilizza.

+0

So che la risposta è vecchia. Ma a partire da Java 8+, questo è possibile. https://www.leveluplunch.com/java/examples/java-util-function-function-example/ – Eternalcode

2

È possibile utilizzare una libreria come Apache Commons Functor che ha funzioni utili come:

UnaryFunction

T evaluate(A obj); 

BinaryFunction

T evaluate(L left, R right);