将项目聚合到超级列表Java中的更有效方法

时间:2017-10-24 22:57:55

标签: java google-app-engine guava

我正在寻找一种更有效的方法来完成以下代码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功能?可能使用番石榴

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

您可以通过避免ArrayList达到支持数组大小时所需的调整大小操作来提高效率,并且可以通过计算插入前所需的大小来实现。

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很大并且在调整大小期间需要多次复制支持数组,它可以表现得更好。