我正在寻找将 aListenableFuture<Iterable<A>>
转换为个人序列的最佳方法ListenableFutures
。这是我正在寻找的方法签名:
public <A, B> Iterable<ListenableFuture<B>> splitAndRun(
final ListenableFuture<Iterable<A>> elements,
final Function<A, B> func,
final ListeningExecutorService executor
);
显然,如果我回来了,我可以这样做ListenableFuture<Iterable<ListenableFuture<B>>>
,但我觉得我应该能够拆分并运行它并保持它的异步性。
这是我到目前为止的代码,但你会注意到最后的讨厌.get()
,这会破坏事情。如果我把事情复杂化了,请原谅。
public class CallableFunction<I, O> implements Callable<O>{
private final I input;
private final Function<I, O> func;
public CallableFunction(I input, Function<I, O> func) {
this.input = input;
this.func = func;
}
@Override public O call() throws Exception {
return func.apply(input);
}
}
public <A, B> Iterable<ListenableFuture<B>> splitAndRun(
final ListenableFuture<Iterable<A>> elements,
final Function<A, B> func,
final ListeningExecutorService executor
) throws InterruptedException, ExecutionException {
return Futures.transform(elements,
new Function<Iterable<A>, Iterable<ListenableFuture<B>>>() {
@Override
public Iterable<ListenableFuture<B>> apply(Iterable<A> input) {
return Iterables.transform(input, new Function<A, ListenableFuture<B>>() {
@Override
public ListenableFuture<B> apply(A a) {
return executor.submit(new CallableFunction<A, B>(a, func));
}
});
}
}, executor).get();
}