finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable
(替代
my original answer)
但是,如果轉(zhuǎn)型是緩慢的,或者某些輸入可能會(huì)失敗但是對(duì)其他輸入成功會(huì)怎么樣?在這種情況下,我們希望單獨(dú)轉(zhuǎn)換每個(gè)輸出.另外,我們希望確保轉(zhuǎn)換只發(fā)生一次.我們的集合轉(zhuǎn)換方法不能保證這一點(diǎn).因此,在您的示例代碼中,輸出上的每次迭代都會(huì)向執(zhí)行程序提交新任務(wù),即使先前提交的任務(wù)可能已經(jīng)完成.因此,只有在轉(zhuǎn)換是輕量級(jí)的時(shí)候,我們才推薦Iterables.transform和朋友. (通常,如果你正在做重量級(jí)的事情,你的轉(zhuǎn)換函數(shù)將拋出一個(gè)已檢查的異常,函數(shù)不允許.考慮這個(gè)提示:)當(dāng)然,你的例子不會(huì)觸發(fā)提示.)
這在代碼中意味著什么?基本上,我們將顛倒我在其他答案中給出的操作順序.我們將轉(zhuǎn)換為Future< Iterable< A>>到Iterable< Future< A>>第一.然后我們將為每個(gè)A提交一個(gè)單獨(dú)的任務(wù),將其轉(zhuǎn)換為B.對(duì)于后一步,我們將提供Executor so that the transformation doesn’t block some innocent thread.(我們現(xiàn)在只需要Futures.transform,所以我靜態(tài)導(dǎo)入它. )
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;
無(wú)論如何,那就是這個(gè)想法.但我的實(shí)施是愚蠢的.我們可以輕松地同時(shí)執(zhí)行這兩個(gè)步驟:
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;
因?yàn)檫@使得n Futures.transform調(diào)用而不是1并且因?yàn)樗褂脝为?dú)的Executor,所以如果轉(zhuǎn)換是重量級(jí)的,那么它比我的其他解決方案更好,如果它是輕量級(jí)的則更糟.另一個(gè)警告仍然是:只有當(dāng)你知道你將擁有多少輸出時(shí),這才有效.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高空作业证多少钱啊?
- 下一篇: html的table弹窗_Js弹出基于T