У меня следующая ситуация
Map<Key, ListContainer> map;
public class ListContainer{
List<AClass> lst;
}
Я должен объединить все списки lst
из ListContainer
объектов из Map
карты.
public static void main(String args[]){
List<AClass> alltheObjectsAClass = map.values().stream(). // continue....
}
Есть идеи, как с помощью потокового API Java 8?
java
list
java-8
java-stream
mat_boy
источник
источник
{a: [1,2], b[3,4]}
вы хотите объединить их в цепочку[1,2,3,4]
, поставить лайк или составить список списков[[1,2],[3,4]]
, или заархивировать их[[1,3],[2,4]]
? Кроме того, вы знаете, что на карте нет порядка, не так ли?[1,2,3,4]
несортированным!ListContainer
только оборачивает,List<T>
то вы можете заменитьMap<Key, ListContainer>
наMap<Key, List<T>>
Ответы:
Я думаю,
flatMap()
это то, что вы ищете.Например:
источник
.flatMap(Collection::stream)
здесь невозможно?ListContainer
он инкапсулирован (т.е. имеет геттер дляlst
), вы можете разложить его.flatMap(->)
на.map(ListContainer::getLst)
.flatMap(Collection::stream)
.flatMap(Collection::stream)
это невозможно, было бы лучше, я думаю. Должен быть более постоянным..map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Альтернатива: Stream.concat ()
источник
В Java 8 мы можем использовать поток List1.stream (). Collect (Collectors.toList ()). AddAll (List2); Другой вариант List1.addAll (List2)
источник
Уже ответил выше, но вот другой подход, который вы можете использовать. Я не могу найти исходный пост, из которого я адаптировал его, но вот код для вашего вопроса. Как отмечалось выше, функция flatMap () - это то, что вы хотели бы использовать с Java 8. Вы можете добавить ее в служебный класс и просто вызвать "RandomUtils.combine (list1, list2, ...);" и вы получите единый список со всеми значениями. Просто будьте осторожны с подстановочным знаком - вы можете изменить его, если хотите менее общий метод. Вы также можете изменить его для наборов - вам просто нужно позаботиться об использовании flatMap () для наборов, чтобы избежать потери данных из методов equals / hashCode из-за природы интерфейса 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()); }
источник