gpt4 book ai didi

java - 如何将一种类型的 CompletableFuture 转换为另一种类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:12 25 4
gpt4 key购买 nike

我目前正在转换我的 CompletableFuture<X>CompletableFuture<Void>如下所示,但我想知道是否有更好的方法。

@Override
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenApply(c -> empty());
}

public Void empty() {
return null;
}

最佳答案

您实际上是在尝试转换 CompletableFuture 的完整值转换为 Void 类型的值.如果那个 future 异常完成,大概你想传播任何异常。

CompletableFuture提供 thenApply 对于这个基本的转换,但也可以使用其他方法。

在您的情况下,您将希望忽略源 future 的值并返回 null , 自 null是类型 Void 的唯一可能值.但是,编译器需要一些提示,表明您的目标是 Void 类型。 .

要么通过为 thenApply 的调用提供显式类型参数来显式

public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).<Void> thenApply(c -> null);
}

或者通过转换为 lambda 表达式中的适当类型来显式

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());
}

所有这些解决方案都会传播原始 CompletableFuture 的异常(如果有的话) .

感谢Luis , 你也可以只使用 thenAcceptConsumer什么都不做:

public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
return realChannel.write(engineToSocketData).thenAccept(c -> {}):
}

任何其他类型的行为都是相同的。 thenApply让你执行任何 Function关于 CompletableFuture 的结果.

例如,我可以拥有一个以 String 结束的 future 这意味着要转换为 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> .

关于java - 如何将一种类型的 CompletableFuture 转换为另一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37152203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com