上次我们熟悉了ListenableFuture
。 我答应介绍更高级的技术,即转换和链接。 让我们从简单的事情开始。 假设我们有从某些异步服务获得的ListenableFuture<String>
。 我们还有一个简单的方法:
Document parse(String xml) {//...
我们不需要String
,我们需要Document
。 一种方法是简单地解析Future
( 等待它)并在String
上进行处理。 但是,更优雅的解决方案是在结果可用后立即应用转换,并将我们的方法视为始终返回ListenableFuture<Document>
。 这很简单:
final ListenableFuture<String> future = //...
final ListenableFuture<Document> documentFuture = Futures.transform(future, new Function<String, Document>() {
@Override
public Document apply(String contents) {
return parse(contents);
}
});
或更可读:
final Function<String, Document> parseFun = new Function<String, Document>() {
@Override
public Document apply(String contents) {
return parse(contents);
}
};
final ListenableFuture<String> future = //...
final ListenableFuture<Document> documentFuture = Futures.transform(future, parseFun);
Java语法有一定的局限性,但请专注于我们刚刚做的事情。 Futures.transform()
不会等待基础的ListenableFuture<String>
应用parse()
转换。 相反,它在后台注册了一个回调,希望在给定将来完成时得到通知。 在适当的时候对我们动态透明地应用了此转换。 我们仍然有Future
,但是这次包装了Document
。
因此,让我们更进一步。 我们还有一个异步的,可能长时间运行的方法,用于计算给定