finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable
(替代
my original answer)
但是,如果轉型是緩慢的,或者某些輸入可能會失敗但是對其他輸入成功會怎么樣?在這種情況下,我們希望單獨轉換每個輸出.另外,我們希望確保轉換只發生一次.我們的集合轉換方法不能保證這一點.因此,在您的示例代碼中,輸出上的每次迭代都會向執行程序提交新任務,即使先前提交的任務可能已經完成.因此,只有在轉換是輕量級的時候,我們才推薦Iterables.transform和朋友. (通常,如果你正在做重量級的事情,你的轉換函數將拋出一個已檢查的異常,函數不允許.考慮這個提示:)當然,你的例子不會觸發提示.)
這在代碼中意味著什么?基本上,我們將顛倒我在其他答案中給出的操作順序.我們將轉換為Future< Iterable< A>>到Iterable< Future< A>>第一.然后我們將為每個A提交一個單獨的任務,將其轉換為B.對于后一步,我們將提供Executor so that the transformation doesn’t block some innocent thread.(我們現在只需要Futures.transform,所以我靜態導入它. )
List> individuals = newArrayList();
for (int i = 0; i < knownSize; i++) {
final int index = i;
individuals.add(transform(input,new Function,A>() {
@Override
public A apply(List values) {
return values.get(index);
}
}));
}
List> result = newArrayList();
for (ListenableFuture original : individuals) {
result.add(transform(original,function,executor));
}
return result;
無論如何,那就是這個想法.但我的實施是愚蠢的.我們可以輕松地同時執行這兩個步驟:
List> result = newArrayList();
for (int i = 0; i < knownSize; i++) {
final int index = i;
result.add(transform(input,B>() {
@Override
public B apply(List values) {
return function.apply(values.get(index));
}
},executor));
}
return result;
因為這使得n Futures.transform調用而不是1并且因為它使用單獨的Executor,所以如果轉換是重量級的,那么它比我的其他解決方案更好,如果它是輕量級的則更糟.另一個警告仍然是:只有當你知道你將擁有多少輸出時,這才有效.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高空作业证多少钱啊?
- 下一篇: 冠状动脉造影多少钱啊?