Frage

Ich versuche, eine faule Sequenz zu implementieren (was bedeutet, dass der nächste Punkt nur, wenn Sie rufen Sie die Sprungfunktion berechnet wird), und eine der Methoden, sollte es ist „Karte“, die eine Funktion erhält, dass alle Mitglieder betroffen . Die eleganteste Art und Weise, dies zu tun, ist die Verwendung Funktion Zusammensetzung und weisen Sie die neue Funktion der Funktion variabel, aber da Funktionen in Java nicht erste Klasse Werte habe ich keine Ahnung, wie dies zu tun.

Ich dachte an eine Klasse mit, dass nur eine Funktion enthält, als eine Art „Funktionszeiger“ Wrapper, aber ich sehe nicht, wie das für die Zusammensetzung verwendet werden kann.

Edit: Frage ist Hausaufgaben zusammen. Auch sollte es in der Lage sein, mehrere Zusammensetzungen entlang der Linien von der Karte (Karte (Karte (stepfunction ()))) ( „Karte“ in diesem Fall wird die Funktion durch die Methode „Karte“ gegeben ist) handhaben.

War es hilfreich?

Lösung

Willkommen in Java und seine Schmerzen.

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());
    }
}

Andere Tipps

Google Kollektionen Function Typen hat, die Functions.compose(Function, Function) Methode, die Iterables.transform(Iterable, Function) Methode, und vieles mehr.

Sie nicht hilfreich, wenn dies für die Hausaufgaben ist (ich wirklich jeder wünschen würde offen legen, wenn ihre Frage Hausaufgaben bezogen).

In Java, Sie tun dies immer mit einem Klasse-Protokoll. Siehe java.lang.Thread und die Lauffunktion für das kanonische Beispiel. Es gibt keine ‚Funktionszeiger‘ oder ‚Funktionsvariablen‘ in Java.

FWIW, die "Funktionszeiger" Äquivalent in Java ist eine Schnittstelle mit einem einzigen Verfahren. Sie implementieren die Schnittstelle mit einer gewissen Klasse, die eine Implementierung des Verfahrens sieht vor, und speichern Sie dann einen Verweis auf diese Klasse Objekt.

Ändern den Verweis auf ein anderes Objekt der Klasse, die das Verfahren implementiert unterschiedlich, äquivalent ist, die Funktionszeiger auf Punkt zu einer anderen Funktion zu ändern.

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);
    }
}

der Anruf gilt (Liste, neue Displayfunction ());

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top