Holmenkollen district Last time we familiarized ourselves with ListenableFuture . I promised to introduced more advanced techniques, namely transformations and chaining. Let's start from something straightforward. Say we have our ListenableFuture<String> which we got from some asynchronous service. We also have a simple method: Document parse(String xml) {//... We don't need String , we need Document . One way would be to simply resolve Future ( wait for it) and do the processing on String . But much more elegant solution is to apply transformation once the results are available and treat our method as if was always returning ListenableFuture<Document> . This is pretty straightforward: final ListenableFuture<String> future = //... final ListenableFuture<Document> documentFuture = Futures.transform(future, new Function<String, Document>() { @Override public Document apply(String contents) { return parse(contents); }