将项目聚合到超级列表中的更有效方法 Java
More efficient method of aggregating items into super list Java
我正在寻找一种更有效的方法来完成以下代码在 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 功能的情况下完成此操作?可能使用 Guava
List<Order> orders = getOrders();
List<LineItem> lineItems = new ArrayList<>();
for (final Order order : orders) {
lineItems.addAll(order.getItems());
}
您可以通过避免 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
很大并且在调整大小期间需要多次复制支持数组,它可以执行得更好。
我正在寻找一种更有效的方法来完成以下代码在 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 功能的情况下完成此操作?可能使用 Guava
List<Order> orders = getOrders();
List<LineItem> lineItems = new ArrayList<>();
for (final Order order : orders) {
lineItems.addAll(order.getItems());
}
您可以通过避免 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
很大并且在调整大小期间需要多次复制支持数组,它可以执行得更好。