2017-10-24 9 views
1

다음 코드 pre java 8의 결과를 얻는보다 효율적인 방법을 찾고 있습니다 (아직 Java 8을 지원하지 않는 Google App Engine에서 호스팅되는 앱에 있습니다.) 슈퍼 목록으로 항목을 집계하는보다 효율적인 방법 Java

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

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

자바 8 기능을 사용하지 않고도이를 달성의보다 효율적인 방법이 있습니까? 아마도 당신은 그것을이 보조 배열의 크기를 칠 때 ArrayList가 필요로하는 크기 조정 작업을 피함으로써 좀 더 효율적으로 만들 수 있고, 그 삽입하기 전에 필요한 크기를 계산하여입니다 구아바

답변

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

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

를 사용하여. 이 두 번 orders를 스캔 것이지만 getItems 큰이며, 백업 배열은 크기 조정하는 동안 여러 번 복사해야하는 경우

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()); 
} 

, 더 나은 수행 할 수 있습니다.

+0

코드를 복잡하게 만드는 마이크로 최적화처럼 보이므로 마지막 목록에 몇 백만 개의 요소가 있다고 예상하지 않는 한이 방법을 사용하지 않을 것입니다 (심지어 크기를 추측 할 수도 있음). 추가 코드 라인은 그만한 가치가 없습니다. – Xaerxess

+0

@Xaerxess 당신은 어떻게 추측하겠습니까? 마법의 숫자를 던져? 이 질문은 목록의 크기를 지정하지 않고 효율적으로 만드는 것에 대해 질문했습니다. –

+0

'새로운 ArrayList <> (expectedOrderSize * orders.size())', (크기의) 순서가 맞다면 최대 2-3 크기의 크기를 가질 수 있습니다. – Xaerxess