gpt4 book ai didi

java - 通过拆分和运行将 ListenableFuture> 转换为 Iterable>

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:43 27 4
gpt4 key购买 nike

我正在寻找转换 ListenableFuture<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();
}

最佳答案

如果你想到ListenableFuture作为一个盒子,为了从那个盒子里得到东西,你必须阻塞线程(调用 get 方法)。

不确定实现 splitAndRun方法可以在某种程度上使您受益。您仍然会有一个返回 ListenableFuture<Iterable<A>> 的异步操作。 .

加入的逆向操作Iterable<ListenableFuture<A>>作为一个ListenableFuture<Iterable<A>>不过可能会有用。如果您想将多个异步计算收集到一个中,则可能需要使用它。

关于java - 通过拆分和运行将 ListenableFuture<Iterable<A>> 转换为 Iterable<ListenableFuture<B>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com