Ich versuche, die Verschachtelung von CompletableFuture
zu vermeiden, wenn zwei unabhängige mit einer BiFunction
kombiniert werden, die eine dritte zurückgibt.
Momentan schneidet thenCombine()
nicht ab:
Ich versuche im Grunde einen Weg zu finden, der wie haskell aussieht, wenn es ein CompletableFuture
monad gibt:
Ich habe irgendwo gelesen, dass join()
die flatMap
von Compleable future ist, also denke ich, ich könnte diese Methode verwenden, um etwas wie aFuture.thenCombine(bFuture, ((Function<CompletableFuture<C>,C>) CompletableFuture::join).compose(this::makeSomeC)
zu machen, aber ich bin mir nicht sicher, ob dies der richtige / empfohlene Weg ist. Und ich kann nicht sagen, dass dies Lesbarkeit in irgendeiner Weise hilft ...
Mir scheint, dass thenCompose
das direkte Äquivalent zu Haskell Monad.bind
ist.
thenCompose
kann auf die gleiche Weise wie die Haskell-Monadenbindung verschachtelt werden, was auch das Ergebnis einer do-Expression in Haskell ist. Damit kann Ihr Problem gelöst werden:
Dies kann man sehen, wenn man die Arten der Funktionen untersucht.
Monad bind - was in Haskell >>=
geschrieben wird - hat den folgenden Typ:
thenCompose
in Java hat die folgende Signatur:
Das oben in Haskell Syntax, mit einem zusätzlichen Parameter als explizite this
konvertiert, sieht so aus:
Wir können sehen, dass dies die gleiche Struktur wie der Haskell-Typ hat. Der Unterschied ist der Name und die Tatsache, dass Haskell die Unterstützung für höher-kinked unterstützt, wird durch Java-Schnittstellen nicht genau ausgedrückt.
Aber ich bin etwas verwirrt über Ihren Haskell-Code. Für mich sieht Ihr Haskell Code folgendermaßen aus:
%Vor% Das heißt, warten bis die Operation makeSomeA
abgeschlossen ist, bevor sie mit makeSomeB
beginnt. Der Java-Code hingegen startet die beiden Operationen parallel und wartet dann auf das Ergebnis, bevor er auf C startet. Aber vielleicht ist es eine Faulheit.
Ich denke, die einfachste Lösung besteht darin, ein thenCompose(identity())
nachher anzuwenden:
Alternativ können Sie eine einfache Pair
-Klasse einführen, um die Ergebnisse von A und B zu kombinieren und thenCompose()
zu verwenden:
Und eine dritte Alternative ohne Pair
:
Tags und Links java haskell java-8 completable-future