Use that to create a Future that returns a userId object ListenableFuture<UserId> userIdFuture = executor.submit( new Callable<UserId>() { public UserId call() { // Initializing "1" as the user id return new UserId(1); } } ); // Step 3. Guava's AsyncFunction class is appropriate here AsyncFunction<UserId, UserDetails> userDetails = new AsyncFunction<UserId, UserDetails>() { public ListenableFuture<UserDetails> apply(UserId userId) { return Futures.immediateFuture(new UserDetails(userId)); // The above instantiation of new UserDetails can be replaced with any long running // piece of code } }; // Step 4.