平时编程时, 将某种类型的Future转化为另一种类型的Future,例如 Future<Data1> => Future<Data2>是非常有用处的,这样多个Future可以连接起来形成Future流,
以下就实现了这样一个转换
public class MapperFuture<T, R> implements Future<R>{
private Function<T,R> mapper;
private Future<T> future;
public static void main(String[] args)throws Exception {
Future<Integer> ageFuture = getAge();
Future<String> msgFuture = new MapperFuture<>(ageFuture, (age) -> "you are "+age+" years old.");
System.out.println(msgFuture.get());
}
static Future<Integer> getAge(){
return new PlainFuture<Integer>(18);
}
public MapperFuture(Future<T> future, Function<T,R> mapper){
this.future = future;
this.mapper = mapper;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return future.cancel(mayInterruptIfRunning);
}
@Override
public boolean isCancelled() {
return future.isCancelled();
}
@Override
public boolean isDone() {
return future.isDone();
}
@Override
public R get() throws InterruptedException, ExecutionException {
return mapper.apply(future.get());
}
@Override
public R get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return mapper.apply(future.get(timeout, unit));
}
}
class PlainFuture<V> implements Future<V>{
private V v;
public PlainFuture(V v){
this.v = v;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public V get() throws InterruptedException, ExecutionException {
return v;
}
@Override
public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return v;
}
}