Question

Je suis en train de mettre en œuvre une séquence paresseuse (ce qui signifie que l'élément suivant est calculé uniquement lorsque vous invoquez la fonction étape), et l'une des méthodes qu'il devrait avoir est « carte » qui reçoit une fonction qui affecte tous les membres . La façon la plus élégante de le faire est d'utiliser la composition de fonctions, et attribuer la nouvelle fonction à la variable de fonction, mais étant donné que les fonctions ne sont pas les premières valeurs de la classe en Java je ne sais pas comment faire.

Je pensais que d'avoir une classe qui contient seulement une fonction, comme une sorte de wrapper « pointeur de fonction », mais je ne vois pas comment cela peut être utilisé pour la composition.

Edit: question devoirs liés. En outre, il doit être capable de gérer plusieurs compositions dans le sens de la carte (carte (carte (stepFunction ()))) ( "carte" dans ce cas étant la fonction donnée par la méthode "map").

Était-ce utile?

La solution

Bienvenue sur Java et ses douleurs.

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

Autres conseils

Google Collections a le type de Function, la méthode Functions.compose(Function, Function), la méthode Iterables.transform(Iterable, Function), et bien plus encore.

Pas utile si cela est pour les devoirs (je souhaite vraiment que tout le monde divulguer quand leur question est liée aux devoirs).

En Java, vous faites toujours cela avec un protocole de classe. Voir java.lang.Thread et la fonction d'exécution pour l'exemple canonique. Il n'y a pas de « pointeurs de fonction » ou « variables de la fonction » en Java.

FWIW, l'équivalent "pointeur de fonction" en Java est un Interface avec une seule méthode. Vous implémentez l'interface avec une certaine classe, ce qui fournit une implémentation de la méthode, puis stocker une référence à cet objet de classe.

Modification de la référence à un autre objet de classe, qui met en oeuvre le procédé différemment, équivaut à changer le pointeur de fonction pour indiquer une fonction différente.

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

l'appel apply (liste, nouvelle DisplayFunction ());

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top