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
map.values()
はCollection<List<E>>
ではなくList<E>
を返します。後者が必要な場合は、ネストされたList<E>
を単一のList<E>
にフラット化する必要があります。続く:
List<E> result = map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
またはforEach
を使用します
map.forEach((k,v)->list.addAll(v));
または青峰がこれを使用してコメントしたように
map.values().forEach(list::addAll);
Java-9以降でこれを行う別の方法を次に示します。
List<E> result = map.values()
.stream()
.collect(Collectors.flatMapping(List::stream, Collectors.toList()));
他の回答に加えて:
List<E> result = map.values()
.stream()
.collect(ArrayList::new, List::addAll, List::addAll);
これもトリックを行うことができます。
単に使用してください:-
map.values().stream().flatMap(List::stream).collect(Collectors.toList());
Collection.stream
とflatMap
は次のようになります:
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)
Collectors2.flatCollect
Eclipseコレクション から
List<String> list =
map.values().stream().collect(Collectors2.flatCollect(l -> l, ArrayList::new));
Map
を適応させ、EclipseコレクションMutableMap
APIを使用することもできます。
List<String> list =
Maps.adapt(map).asLazy().flatCollect(l -> l).toList();
メソッドflatCollect
はメソッドflatMap
と同等ですが、flatCollect
はIterable
ではなくStream
を受け取ります。
注:私はEclipseコレクションのコミッターです。