2017-10-24 12 views
1

次のコードpre java 8の結果をより効率的に達成する方法を探しています(Google App Engineでホストされているアプリケーションで、まだJava 8をサポートしていません)スーパーリストにアイテムを集約するより効率的な方法

List<Order> orders = getOrders(); 
List<LineItem> lineItems = new ArrayList<>(); 

for (final Order order : orders) { 
    for (final LineItem lineItem : order.getItems()) { 
     lineItems.add(lineItem); 
    } 
} 

Java 8の機能を使用しなくても、これを実現する手段がより効率的ですか?おそらくあなたはそれが補助配列のサイズに当たったときArrayListで必要とされるサイズ変更操作を回避することによって、それがより効率的にすることができ、そしてそれは挿入する前に必要なサイズを計算していグアバ

答えて

4
List<Order> orders = getOrders(); 
List<LineItem> lineItems = new ArrayList<>(); 

for (final Order order : orders) { 
    lineItems.addAll(order.getItems()); 
} 
0

を使用。

int size = 0; 
for (Order order : orders) { 
size += order.getItems().size(); 
} 
List<LineItem> lineItems = new ArrayList<>(size); 

for (Order order : orders) { 
    lineItems.addAll(order.getItems()); 
} 

これが二回ordersをスキャンしますが、getItemsが大きいですし、バッキング配列はサイズ変更中に複数回コピーする必要がある場合、それはより良い行うことができます。

+0

最終的なリストに何百万もの要素があると予想しない限り、私はこの方法にはならないマイクロ最適化のようです(サイズを推測しても)。追加のコード行はそれに値するものではありません。 – Xaerxess

+0

@Xaerxessあなたはどう思いますか?魔法の数字を投げる?質問は、リストの大きさを指定せずに効率化することについて質問しました。 –

+0

'新しいArrayList <>(expectedOrderSize * orders.size())'、(大きさの)順序が正しい場合は、最大2-3サイズのサイズ変更が必要です。 – Xaerxess

関連する問題