2014-11-27 23 views
22

Trong khi học Java 8 suối và lambas, tôi đã cố gắng để thay thế lồng nhau sau cho vòng với suối:Cách thích hợp để thay thế một vòng lặp lồng nhau bằng các luồng trong Java 8 là gì?

List<Long> deskIds = new ArrayList<>(); 
for(ProvidedService memberService : service.getAllNodesDepthFirst()){ 
    for(Desk d : memberService.getDesks()){ 
    deskIds.add(d.getId()); 
    } 
} 

Các lặp loop một danh sách các đối tượng 'ProvidedService', và cho mỗi một, lặp trên một tài sản danh sách đối tượng 'Bàn' và trích xuất trường 'Id' thành danh sách.

tôi đã đưa ra đoạn mã sau sử dụng dòng:

List<Long> deskIds = new ArrayList<>(); 
service.getAllNodesDepthFirst().stream().forEach(srv -> { 
    deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList())); 
}); 

Đó có phải là/cách thích hợp tối ưu để làm điều đó? Hoặc là có một cách để làm điều này mà không có dòng lồng nhau thứ hai?

+0

Tôi nghĩ rằng đó là fine.There là không có vấn đề với cách tiếp cận của bạn. –

+0

Để kiểm tra thêm liên kết này: http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html –

+0

@Prakhar: vâng, cách tiếp cận của tôi đã hoạt động, nhưng nó thật là ngây thơ và tôi nghĩ có một số cách để sắp xếp nó, giống như assylias đã chứng minh. –

Trả lời

28

tôi có lẽ sẽ viết nó như thế này:

List<Long> deskIds = service.getAllNodesDepthFirst().stream() 
              .flatMap(p -> p.getDesks().stream()) 
              .map(Desk::getId) 
              .collect(toList()); 
+1

Vâng, tôi đã hy vọng có một cái gì đó như 'flatMap'! –

+0

@assylias Có cách nào dễ dàng không nếu tôi muốn có một bản đồ cuối cùng thay vì một Danh sách, trong đó bản đồ là một số id của OfferService và giá trị là id bàn. – Naman

+0

@Naman bạn có thể xem bộ sưu tập groupingBy. – assylias

Các vấn đề liên quan