"Doppelte" Komposition mit CompleableFuture

8

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:

%Vor%

Ich versuche im Grunde einen Weg zu finden, der wie haskell aussieht, wenn es ein CompletableFuture monad gibt:

%Vor%

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 ...

    
Jerome 13.02.2017, 13:47
quelle

2 Antworten

7

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:

%Vor%

Erklärung der Typen

Dies kann man sehen, wenn man die Arten der Funktionen untersucht.

Monad bind - was in Haskell >>= geschrieben wird - hat den folgenden Typ:

%Vor%

thenCompose in Java hat die folgende Signatur:

%Vor%

Das oben in Haskell Syntax, mit einem zusätzlichen Parameter als explizite this konvertiert, sieht so aus:

%Vor%

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.

Hinweis zum Haskell-Code in der Frage

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.

    
Lii 13.02.2017, 15:48
quelle
6

Ich denke, die einfachste Lösung besteht darin, ein thenCompose(identity()) nachher anzuwenden:

%Vor%

Alternativ können Sie eine einfache Pair -Klasse einführen, um die Ergebnisse von A und B zu kombinieren und thenCompose() zu verwenden:

%Vor%

Und eine dritte Alternative ohne Pair :

%Vor%     
Didier L 13.02.2017 14:20
quelle