读取 CompletableFuture 返回的值
Read value returned in CompletableFuture
来自某个 SDK 的函数正在返回一个 CompletableFuture。一旦达到该值,我该如何正确读取它。
我的代码:
CompletableFuture<Web3ClientVersion> web3clientCompletableFuture;
web3clientCompletableFuture = web3jNode.web3ClientVersion().sendAsync();
sendAsync() 代码(在 SDK 中):
public CompletableFuture<T> sendAsync() {
return web3jService.sendAsync(this, responseType);
}
我可以使用 get() 访问返回的数据,但这会使整个过程同步并阻塞 UI。
我检查了 Android API Reference 上的函数签名,例如:
thenApply(Function<? super T, ? extends U> fn)
handle(BiFunction<? super T, Throwable, ? extends U> fn)
但我似乎需要一些代码示例。
[注意:我对lambda不是很熟悉]
这是 CompletableFuture 的 tutorial that has examples that show you how to use these powerful methods。如果在处理未来后必须 return 值,那么你想使用 thenApply() 是对的。但是如果你只是想处理未来而不是 return 任何东西,你应该使用 thenAccept() 和 thenRun()。还列出了其他方法和示例。
这里有一个例子,它只是 return 一个整数类型的 CompletableFuture:
CompletableFuture<Integer> mynumber = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
mynumber = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return 4 * 4;
});
}
这里的 arg 是上述步骤的结果 (CompletableFuture),在您的情况下是您从 SDK 接收的数据。您正在附加一个回调方法(thenApply())并用它做任何您想做的事情。根据您的实施,您可以附加多个 thenApply()。在这里,我调用了一个方法,该方法将获取结果并对其进行一些计算。
CompletableFuture<Integer> willdoStuff = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
willdoStuff = mynumber.thenApply(arg -> {
compute(arg);
return arg / 2;
});
}
public void compute(int someInt){
Toast.makeText(getApplicationContext(), "The result of the computation is" + someInt, Toast.LENGTH_LONG).show();
}
把sleep代码注释掉就可以在主线程中执行这段代码了。
Lambda 函数只是简单的输入和输出,{} 之前的参数是输入,{} 中的语句实际上是一个对参数(输入)执行某些操作的函数。对此你可能想问不同的问题。
来自某个 SDK 的函数正在返回一个 CompletableFuture。一旦达到该值,我该如何正确读取它。
我的代码:
CompletableFuture<Web3ClientVersion> web3clientCompletableFuture;
web3clientCompletableFuture = web3jNode.web3ClientVersion().sendAsync();
sendAsync() 代码(在 SDK 中):
public CompletableFuture<T> sendAsync() {
return web3jService.sendAsync(this, responseType);
}
我可以使用 get() 访问返回的数据,但这会使整个过程同步并阻塞 UI。
我检查了 Android API Reference 上的函数签名,例如:
thenApply(Function<? super T, ? extends U> fn)
handle(BiFunction<? super T, Throwable, ? extends U> fn)
但我似乎需要一些代码示例。
[注意:我对lambda不是很熟悉]
这是 CompletableFuture 的 tutorial that has examples that show you how to use these powerful methods。如果在处理未来后必须 return 值,那么你想使用 thenApply() 是对的。但是如果你只是想处理未来而不是 return 任何东西,你应该使用 thenAccept() 和 thenRun()。还列出了其他方法和示例。
这里有一个例子,它只是 return 一个整数类型的 CompletableFuture:
CompletableFuture<Integer> mynumber = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
mynumber = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return 4 * 4;
});
}
这里的 arg 是上述步骤的结果 (CompletableFuture),在您的情况下是您从 SDK 接收的数据。您正在附加一个回调方法(thenApply())并用它做任何您想做的事情。根据您的实施,您可以附加多个 thenApply()。在这里,我调用了一个方法,该方法将获取结果并对其进行一些计算。
CompletableFuture<Integer> willdoStuff = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
willdoStuff = mynumber.thenApply(arg -> {
compute(arg);
return arg / 2;
});
}
public void compute(int someInt){
Toast.makeText(getApplicationContext(), "The result of the computation is" + someInt, Toast.LENGTH_LONG).show();
}
把sleep代码注释掉就可以在主线程中执行这段代码了。 Lambda 函数只是简单的输入和输出,{} 之前的参数是输入,{} 中的语句实际上是一个对参数(输入)执行某些操作的函数。对此你可能想问不同的问题。