Funktionale Programmierung in Java?

2 Antworten

Der Code ist gruselig! Ich nehme an, FunctionalImage bekommt eine Funktion f(Point)->Boolean und macht daraus ein Schwarzweißbild.

Das Interface Function<> ist für Methodenparameter und Rückgabetypen geeignet. Es gibt nur selten einen Grund, eine Variable vom Typ Function<> anzulegen. Deine erste Methode lässt sich auch so schreiben:

/** Prüfe, ob p nahe an der y-Achse liegt.
 **/
private static Boolean vertical ( Point p ) {
   return Math.abs(p.x) < 0.5;
}

/** Erzeuge ein Bild, das einen Streifen um die y-Achse zeigt.
  **/
public static FunctionalImage createStrip() {
   return new FunctionalImage(vertical);
}

Die Methode vertical() mag ja noch ihre Daseinsberechtigung haben, wenn es mehrere solche Baustein-Methoden gibt, aus denen verschiedene Bilder aufgebaut werden können. Aber bei createStrip() sehe ich keinerlei Mehrwert. Und bei den Methodennamen ist auch noch Luft nach oben. Mein Vorschlag: isAtYaxis() und createVerticalStripImage().

Deine zweite Methode funktioniert nicht: Offenbar will sie zwei Funktionen verknüpfen, aber die zweite fehlt komplett. Im Body von composition() fehlt damit der Rückgabewert. Das compiliert nicht. Da müsste noch etwas stehen wie

    return after.apply(p);

So würde es klappen (mit sinnvolleren Namen):

public FunctionalImage compose( Function<Point,Point> transform
                             , Function<Point,Boolean> test )
{
   return new FunctionalImage( transform.andThen(test) );
}

Aber auch hier sticht mir der Mehrwert dieser Methode nicht ins Auge.

Deine Funktion "composition" soll nach wie vor ein Boolean zurückgeben. Du wendest "before" auf p an und gibst p dann an die Funktion weiter, die das Bild repräsentiert (aber keine Ahnung, welche das sein soll, womöglich "this" oder soetwas?).