2016-05-11 17 views

答えて

4

あなたは効果的にタイプ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>と推定されます。

関連する問題