web-dev-qa-db-ja.com

HashMap <String、List <E >>からList <E>を取得する方法

stream()を使用してList<E>からMap<String,List<E>>を抽出します(Eはランダムクラスです)。

Java 8のストリームを使用する簡単な1行のメソッドが必要です。

私が今までに試したこと:

HashMap<String,List<E>> map = new HashMap<>();
List<E> list = map.values(); // does not compile
list = map.values().stream().collect(Collectors.toList()); // does not compile
24

map.values()Collection<List<E>>ではなくList<E>を返します。後者が必要な場合は、ネストされたList<E>を単一のList<E>にフラット化する必要があります。続く:

List<E> result = map.values()
                    .stream()
                    .flatMap(List::stream)
                    .collect(Collectors.toList());
33
Ousmane D.

またはforEachを使用します

 map.forEach((k,v)->list.addAll(v));

または青峰がこれを使用してコメントしたように

map.values().forEach(list::addAll);
14
Hadi J

Java-9以降でこれを行う別の方法を次に示します。

List<E> result = map.values()
                    .stream()
                    .collect(Collectors.flatMapping(List::stream, Collectors.toList()));
10

他の回答に加えて:

List<E> result = map.values()
                    .stream()
                    .collect(ArrayList::new, List::addAll, List::addAll);

これもトリックを行うことができます。

4
ETO

単に使用してください:-

map.values().stream().flatMap(List::stream).collect(Collectors.toList());
3
Nicholas K

Collection.streamflatMapは次のようになります:

Map<String, List<E>> map = new HashMap<>(); // program to interface
List<E> list = map.values()
                  .stream()
                  .flatMap(Collection::stream)
                  .collect(Collectors.toList());

または、非ストリームバージョンを次のように使用します。

List<E> list = new ArrayList<>();
map.values().forEach(list::addAll)
2
Naman

Collectors2.flatCollectEclipseコレクション から

List<String> list = 
    map.values().stream().collect(Collectors2.flatCollect(l -> l, ArrayList::new));

Mapを適応させ、EclipseコレクションMutableMap AP​​Iを使用することもできます。

List<String> list = 
    Maps.adapt(map).asLazy().flatCollect(l -> l).toList();

メソッドflatCollectはメソッドflatMapと同等ですが、flatCollectIterableではなくStreamを受け取ります。

注:私はEclipseコレクションのコミッターです。

2
Donald Raab