2014-04-16 55 views
28

ben şu var durum bir Map haritadan tüm listeler ListContainer nesnelerden lst birleştirmek zorundaJava 8: akışı API

Map<Key, ListContainer> map; 

public class ListContainer{ 
    List<AClass> lst; 
} 

ile listeleri birleştirme.

public static void main(String args[]){ 
    List<AClass> alltheObjectsAClass = map.values().stream(). // continue....  
} 

Java 8 akış API'sini nasıl kullanıyorsunuz?

+0

Eğer birleştirilmesiyle ilgili ne anlama geldiğini bir örnek verebilir misiniz? Haritanızın '{a: [1,2], b [3,4]} olduğunu söyleyin, onları [1,2,3,4] gibi zincirlemek mi yoksa bir liste listesi yapmak mı istiyorsunuz? [[1,2], [3,4]], ya da zip [[1,3], [2,4]] '? Ayrıca, bir Haritanın siparişi olmadığını biliyorsunuz, değil mi? –

+0

@tobias_k Sonucun [1,2,3,4] ', sıralanmamış olmasını istiyorum! –

+0

'ListContainer 'sadece bir' List 'öğesini sararsa,' Map 'ile' 'Harita >' – ThePyroEagle

cevap

82

Bence flatMap() ne arıyorsanız. Örneğin

:

List<AClass> allTheObjects = map.values() 
     .stream() 
     .flatMap(listContainer -> listContainer.lst.stream()) 
     .collect(Collectors.toList()); 
+17

'u değiştirebilirsiniz. Ma Flatmap'ın sadece .flatMap (Collection :: stream) ' – Jean

+1

olabilir mi? Neden ".flatMap (Collection :: stream)' ın neden burada mümkün olmadığını açıklayan yorumlar silindi? – Puce

+0

@Puce good question, ancak bunun bir anlamı var: ListContainer öğesi kapsüllenmişse (yani lst' için bir getlete sahipse), .flatMap (->) 'in .map (ListContainer :: getLst) içine ayrıştırabilirsiniz.) '' .flatMap (Koleksiyon :: akış) ' – TWiStErRob

22

Alternatif: Stream.concat()

Stream.concat(map.values().stream(), listContainer.lst.stream()) 
          .collect(Collectors.toList() 
+0

artı 1 soruya cevap vermese de, bu sorunun cevabını –

+0

tam olarak ne aradığımı yanıtlıyor! Teşekkürler! – Hans