Mam następującą sytuację
Map<Key, ListContainer> map;
public class ListContainer{
List<AClass> lst;
}
Muszę scalić wszystkie listy lst
z ListContainer
obiektów z Map
mapy.
public static void main(String args[]){
List<AClass> alltheObjectsAClass = map.values().stream(). // continue....
}
Masz jakiś pomysł, jak, używając strumieniowego API Java 8?
java
list
java-8
java-stream
mat_boy
źródło
źródło
{a: [1,2], b[3,4]}
, czy chcesz je[1,2,3,4]
połączyć w łańcuch, polubić , utworzyć listę list[[1,2],[3,4]]
lub spakować je[[1,3],[2,4]]
? Wiesz też, że mapa nie ma porządku, prawda?[1,2,3,4]
nieposortowany!ListContainer
tylko owijaList<T>
następnie można wymienićMap<Key, ListContainer>
zMap<Key, List<T>>
Odpowiedzi:
Myślę, że
flatMap()
właśnie tego szukasz.Na przykład:
źródło
.flatMap(Collection::stream)
nie jest to możliwe?ListContainer
jest hermetyzowane (tj. Ma getterlst
), możesz rozłożyć.flatMap(->)
na.map(ListContainer::getLst)
.flatMap(Collection::stream)
.flatMap(Collection::stream)
nie jest to możliwe, byłoby lepiej, jak sądzę. Powinien być bardziej trwały..map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Alternatywa: Stream.concat ()
źródło
W Javie 8 możemy użyć strumienia List1.stream (). Collect (Collectors.toList ()). AddAll (List2); Inna opcja List1.addAll (List2)
źródło
Odpowiedziałem już powyżej, ale oto inne podejście, które możesz zastosować. Nie mogę znaleźć oryginalnego posta, z którego to dostosowałem, ale oto kod na potrzeby twojego pytania. Jak wspomniano powyżej, funkcja flatMap () jest tym, czego chciałbyś użyć w Javie 8. Możesz wrzucić ją do klasy narzędziowej i po prostu wywołać "RandomUtils.combine (list1, list2, ...);" i otrzymasz pojedynczą listę ze wszystkimi wartościami. Uważaj tylko na symbole wieloznaczne - możesz to zmienić, jeśli chcesz mniej ogólną metodę. Możesz również zmodyfikować go dla Setów - po prostu musisz uważać podczas używania flatMap () na Setach, aby uniknąć utraty danych z metod equals / hashCode ze względu na naturę interfejsu Set.
/** * Combines multiple lists into a single list containing all elements of * every list. * * @param <T> - The type of the lists. * @param lists - The group of List implementations to combine * @return a single List<?> containing all elements of the passed in lists. */ public static <T> List<?> combine(final List<?>... lists) { return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList()); }
źródło