Frage

Ich weiß, dass eines der Ziele der rein funktionalen Programmierung darin besteht, Veränderlichkeit zu beseitigen und damit Nebenwirkungen auszuschließen.Aber seien wir ehrlich: Java ist trotz aller vorhandenen Bibliotheken für funktionale Programmierung keine funktionale Sprache.Tatsächlich scheint es, dass einige der FP-Bibliotheken dies wissen und erwarten.In Functional Java gibt es zum Beispiel das Effect Klasse.In der Jedi FP-Bibliothek gibt es die Command Schnittstelle.Dadurch können Sie unter anderem ein Befehlsmuster mit Typsicherheit auf Elemente von an anwenden Iterable ohne die fiese for-Schleife-Boilerplate.

Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
    public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );

Die Frage ist also: Gibt es so etwas in Guave?

BEARBEITET, NACHDEM DIE ANTWORT ZUR KLÄRUNG AKZEPTIERT WURDE

Ich entwickle eine Rahmen Das hilft unter bestimmten Umständen bei dem „vertikalen Problem“, das den meisten Java-FP-Bibliotheken innewohnt.So würde ich nicht Erstellen Sie tatsächlich das Codebeispiel wie oben gezeigt:d. h. deklarieren Sie explizit eine neue Klassenimplementierung von Command mit all seinem ekligen Vertikalrauschen, nur um es sofort nach der Erklärung anzuwenden.

Ich dachte eher an das eigentliche Befehlsmuster, bei dem es möglicherweise mehrere mögliche Befehle gibt, die an anderer Stelle deklariert werden, und nur einer davon an den Code übergeben wird, der ihn iterativ anwenden möchte.Darüber hinaus besteht das Ziel meines Frameworks darin, die Erstellung funktionaler Schnittstellenobjekte (Funktionen, Prädikate, Befehle und andere einfache Lambdas) idiomatischer zu gestalten, ohne das vertikale Problem einfach an eine andere Stelle zu verschieben.Mir ist schon lange klar, dass dies nicht in den Geltungsbereich von Guava fällt.Da aber in anderen FP-Bibliotheken befehlsähnliche Schnittstellen verfügbar sind, wollte ich nur wissen, ob es in Guava ein Analogon gibt.

Ein vollständigeres Codebeispiel unter Verwendung meines Frameworks könnte etwa so aussehen:

class Stuff {
    private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
    public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
    public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());

    // methods exist for use elsewhere, but are conveniently also wrapped as commands
    public void someMethod1() {...}
    public void someMethod2() {...}
}

class Activity {
    public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
        doSomeThings();
        ...
        forEach(stuffs, doCmd);
        ...
        doOtherThings();
    }
}
War es hilfreich?

Lösung

Nein!

Kevin Bourrillion, der Leiter des Guava-Projekts, sagte zu den Funktionsmerkmalen von Guava:

„Die Syntax ist scheiße.Gleichzeitig ist und bleibt dieses Zeug jetzt, schon immer und wird immer nur eine Notlösung sein, bis die richtige Sprachänderung zustande kommt. Dann können wir uns endlich wirklich für die optimale Syntax entscheiden und mit der funktionalen Programmierung beginnen das Leben in Java tatsächlich einmal besser machen.Daher bin ich mir nicht sicher, wie viel Aufwand ich in das Funktions-/Prädikat-Zeug stecken soll.Es befindet sich eher in der Bibliothek, weil es so sein musste, und nicht so sehr, weil wir es für ein Kronjuwel halten.“

Wir werden unsere Strategie wahrscheinlich deutlich ändern, wenn Java 8 auf den Markt kommt, aber das wird noch eine Weile dauern.

Außerdem haben wir nicht viele Anwendungsfälle gefunden, für die wir denken, dass dies der Fall ist Command Die von Ihnen beschriebene Schnittstelle wäre die beste Lösung.Wir denken zum Beispiel, dass Ihr obiger Code viel besser geschrieben wäre als

for(PhoneNumber phone : phoneList) {
  phone.call();
}

die altmodische Art.Wir könnten möglicherweise von der Verdienstmöglichkeit überzeugt sein Command, aber ich denke, dass der „Für-jeden“-Anwendungsfall fast immer besser auf die altmodische Art und Weise umgesetzt wird.

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