CompletableFuture
your の完成した値を type の値に効果的に変換しようとしていますVoid
。おそらく、その未来が例外的に完了した場合、例外を伝播したいと思うでしょう。
CompletableFuture
はthenApply
この基本的な変換を提供しますが、他の方法も使用できます。
あなたの場合、ソース future からの値を無視して return にする必要があります。 type の唯一の可能な値だnull
からです。ただし、 type をターゲットにしていることをコンパイラに示すヒントが必要です。null
Void
Void
の呼び出しに明示的な型引数を指定して明示的にするかthenApply
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).<Void> thenApply(c -> null);
}
または、ラムダ式で適切な型にキャストして明示的にします
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenApply(c -> (Void) null);
}
値が正しい型であることがわかっているため、ソリューションは同じ結果を達成しますが、追加のメソッド呼び出しが含まれます
@Override
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenApply(c -> empty());
}
これらのソリューションはすべて、元の .xml の例外があればそれを伝播しますCompletableFuture
。
Luisに感謝します。何もしないで使用することもできますthenAccept
。Consumer
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenAccept(c -> {}):
}
動作は他のタイプでも同じです。の結果thenApply
に対して任意の操作を実行できます。Function
CompletableFuture
たとえば、 にString
変換することを意図した で完了することを意図した未来を持つことができますInteger
。
public static void main(String[] args) throws Exception {
CompletableFuture<String> futureLine = CompletableFuture.supplyAsync(() -> "1234");
CompletableFuture<Integer> theNumber = futureLine.thenApply(Integer::parseInt);
System.out.println(theNumber.get());
}
thenApply
は完成した値を受け取り、それを の呼び出しに渡すことによって変換しますInteger#parseInt(String)
。parseInt
の戻り値の型があるためint
、 の戻り値の型thenApply
は に推論されCompletableFuture<Integer>
ます。