2014-04-16 18 views
28

Mam następującą sytuacjęJava 8: scalić list ze strumienia API

Map<Key, ListContainer> map; 

public class ListContainer{ 
    List<AClass> lst; 
} 

muszę połączyć wszystkie listy lst od ListContainer obiektów z Map mapie.

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

Każdy pomysł, jak korzystać z API strumienia 8 Java?

+0

Czy możesz podać przykład tego, co masz na myśli z połączenia? Powiedz, że twoja mapa to '{a: [1,2], b [3,4]}', czy chcesz je połączyć, np. '[1,2,3,4]', lub utworzyć listę list, '[[1,2], [3,4]]' lub zip je ['1,3], [2,4]]'? Wiesz również, że mapa nie ma porządku, prawda? –

+0

@tobias_k Chcę, aby wynik był '[1,2,3,4]', nieposortowany! –

+0

Jeśli 'ListContainer' opakowuje tylko' List 'wtedy możesz zastąpić' Mapę '' Mapą > ' – ThePyroEagle

Odpowiedz

82

Myślę, że flatMap() jest tym, czego szukasz.

Na przykład:

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

Zauważ, że flatmap może być po prostu' .flatMap (Collection :: stream) ' – Jean

+1

? Dlaczego usunięto komentarze wyjaśniające, dlaczego '.flatMap (Collection :: stream)' nie jest tutaj dostępny? – Puce

+0

@Pobierz dobre pytanie, ale jest to możliwe: jeśli 'ListContainer' jest hermetyzowany (tzn. Ma getter dla' lst'), możesz rozłożyć '.flatMap (->)' na '.map (ListContainer :: getLst) '' .flatMap (Collection :: stream) ' – TWiStErRob

22

Alternatywa: Stream.concat()

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

plus 1, mimo że nie odpowiada na pytanie, to odpowiada na pytanie o numer –

+0

Dokładnie to, czego szukałem! Dzięki! – Hans

Powiązane problemy