あなたは効果的にタイプVoid
の値にあなたのCompletableFuture
の完了値を変換しようとしています。おそらく、その未来が例外的に完了した場合は、例外を伝播したいと考えています。
CompletableFuture
は、この基本的な変換のためにを提供するが、他の方法も使用することができる。あなたのケースでは
、あなたはnull
タイプVoid
のための唯一の可能な値であることから、ソース未来から値を無視してnull
を返すようにしたいでしょう。しかし、タイプVoid
を対象としているコンパイラのヒントが必要です。
どちらか
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenApply(c -> (Void) null);
}
ラムダ式に適切な型にキャストして
thenApply
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).<Void> thenApply(c -> null);
}
または明示的なことの呼び出しに明示的な型の引数を提供することにより、明示的であるあなたのソリューションは、同じことを実現結果は、値が正しい型であることが分かっているが、余分なメソッド呼び出しを伴うためです。
@Override
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenApply(c -> empty());
}
これらのソリューションはすべて、元のCompletableFuture
の例外があればそれを伝播します。
他のタイプの動作は同じです。 thenApply
を使用すると、CompletableFuture
の結果にFunction
を実行できます。
たとえば、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>
と推定されます。