Domanda

Sto cercando di implementare una sequenza pigro (il che significa che l'elemento successivo viene calcolato solo quando si richiama la funzione di passo), e uno dei metodi che dovrebbe avere è "mappa" che riceve una funzione che colpisce tutti i membri . Il modo più elegante per fare questo è quello di utilizzare la funzione di composizione, e assegnare la nuova funzione alla variabile funzione, ma dal momento che le funzioni non sono valori di prima classe in Java non ho idea di come fare questo.

ho pensato di avere una classe che contiene solo una funzione, come una sorta di wrapper "puntatore a funzione", ma io non vedo come che può essere utilizzato per la composizione.

Edit: domanda è correlata compiti a casa. Inoltre, dovrebbe essere in grado di gestire più composizioni lungo le linee di mappa (map (mappa (stepFunction ()))) ( "mappa" in questo caso è la funzione data attraverso il metodo "mappa").

È stato utile?

Soluzione

Benvenuti a Java e dei suoi dolori.

interface Function<T> {
    public T eval(T argument);
}

class Lazy<T> {
    private Iterator<T> source;
    private Function<T> filter;
    Lazy(final Iterator<t> source, final Function<T> filter) {
        this.source = source;
        this.filter = filter;
    }
    public T step() {
        return filter.eval(source.next());
    }
}

Altri suggerimenti

Google Collezioni ha il tipo Function, il metodo Functions.compose(Function, Function), il metodo Iterables.transform(Iterable, Function), e molto altro ancora.

Non utile a voi se questo è per i compiti a casa (Mi piacerebbe che tutti avrebbero rivelato quando il loro domanda è compiti legati).

In Java, fai sempre questo con un protocollo di classe. Vedere java.lang.Thread e la funzione di esecuzione per l'esempio canonico. Non ci sono 'puntatori a funzione' o 'variabili di funzione' in Java.

FWIW, la "funzione di puntamento" equivalente in Java è un interfaccia con un solo metodo. Si implementa l'interfaccia con una certa classe, che fornisce un'implementazione del metodo, e quindi memorizzare un riferimento a tale oggetto classe.

Cambiando il riferimento ad un altro oggetto classe, che implementa il metodo diverso, equivale a modificare il puntatore alla funzione per puntare ad una funzione diversa.

public static <T> void apply(final List<T> list, final Function<T> func)
{
    for(final T val : list)
    {
        func.perform(val);
    }
}

interface Function<T>
{
    void apply(T value);
}

class DisplayFunction<T>
    implements Function<T>
{
    public void perform(T value)
    {
        System.out.println(value);
    }
}

la chiamata si applica (elenco, nuova DisplayFunction ());

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top