7,540
edits
Changes
Java-mis
,→thenCompose()
==thenCompose()==
===Mi ez? ===
Miért működik ez a lánc hívás:
<source lang="java">
A **'''thenComplete(..)** ''' a **'''java.util.concurrent** ''' csomagban lévő **'''CompletionStage** ''' osztály metódusa. A láncot indító metódusnak értelem szerűen egy **'''CompletionStage** ''' példánnyal kell visszatérnie. <br>
A **'''thenCompose** ''' szignatúrája az alábbi:
<source lang="java">
<U> LogCompletionStage<U> thenCompose(Function<? super T, ? extends CompletionStage<U>> var1);
<br>
<br>
Láthatjuk, hogy egy **'''Function** ''' interfészt vár paraméterül. A 'Function' interfésze nem más mint egy "gyári" funkcionális interfész típus (olyan mint az előző példába a 'Consumer' interfész volt). A funkcionális interfészekkel szemben támasztott követelmény, hogy egy nem implementált metódusuk legyen, ami ebben az esetben az **'''apply()**'''. A **'''T** ''' az input típusa, míg **'''R** ''' a visszatérési típus.
<source lang="java">
<br>
<br>
Tehát a **'''thenCompose(..)** ''' vár egy **'''Function** ''' interfész implementációt és belül meg fogja hívni az **'''apply(..)** ''' metódusát. Hogy ezt megértsük, nézzük meg a **'''thenCompose** ''' implementációját:
<source lang=java>
public <U> LogCompletableFuture<U> thenCompose(Function<? super T, ? extends CompletionStage<U>> fn) {
}
</source>
Vagyis a **'''thenCompose(..)** ''' egy ponton meg fogja hívni az átadott Function implementáció **'''apply()** ''' metódusát.
Java 8-tól ezt lambda kifejezéssel is le lehet írni inline implementációval, ahol az inline implementáció szimbolizálja jelen esetben az **'''apply(..)** ''' vagyis az adott funkcionális interfész implementálandó metódusának az inline implementációját. Tehát az alábbi kifejezés esetében:
<source lang="java">
...
...
</source>
A **'''var1** ''' nem más mint a bemenő paraméter (T) és a **'''method2(...)** ''' visszatérési értéke pedig R, aminek a **'''thenCompose** ''' szignatúrájából következően kötelezően **'''CompletionStage** ''' leszármazottnak kell lennie. <br>
{{note|Tehát még egyszer: Az inline implementáció a funkcionális interfész egyetlen egy implementálandó metódusának belsejét reprezentálja!}}
<br>
<br>
===Lánc hívás===
Fontos még, hogy java8-tól kezdve a funkcionális interfész hívás láncban az előző inline implementáció visszatérési értékét (R) automatikusan megkapja a következő funkcionális interfész implementáció bemenő paraméterként (T).Tehát az alábbi láncban:
<source lang="java" line start="1">
* A 2. sorban lévő method3 hívás visszatérési érteke bele fog kerülni a var2-be a 3. sorban.
{{note|Tehát a lambda kifejezések láncban hívásakor mindig a Funkcionális interfész definíciójában szereplő T és R input és output típusok közlekednek automatikusan. Annak ellenére, hogy minden egyes inline implementáció a láncban egy **? extends CompletionStage<U>>** -el kell visszatérjen, ebből az U-t fogja megkapni a következő inline implementáció méghozzá ezért: .... }}
<br>
<br>
===Rövidítés===
Na de mit jelent ez a sor:
<source lang="java">