我想使用Java流执行以下操作:
我有一个Map<Enum, List<A>>
,我想将其转换为List<B>
具有B
属性的Enum, A
。
因此,对于每个键和该键列表中的每个项目,我都需要制作一个B
项并将它们全部收集到List<B>
中。
如何使用Java流完成它?
谢谢!
答案 0 :(得分:6)
您可以flatMap
B
个地图条目。
List<B> bList = map.entrySet().stream()
// a B(key, value) for each of the items in the list in the entry
.flatMap(e -> e.getValue().stream().map(a -> new B(e.getKey(), a)))
.collect(toList());
答案 1 :(得分:2)
为了这个示例,我将把B
称为Pair<Enum, A>
。您可以使用#flatMap和嵌套流来完成它:
List<Pair<Enum, A>> myList =
//Stream<Entry<Enum, List<A>>>
myMap.entrySet().stream()
//Stream<Pair<Enum, A>>
.flatMap(ent ->
//returns a Stream<Pair<Enum, A>> for exactly one entry
ent.getValue().stream().map(a -> new Pair<>(ent.getKey(), a)))
.collect(Collectors.toList()); //collect into a list
简而言之,您可以利用Map#entrySet
来检索可以流式传输的地图条目的集合。 #flatMap
将为流中的每个元素获取流的返回值,并将其组合。
答案 2 :(得分:1)
一个简单的forEach
解决方案是:
List<B> bList = new ArrayList<>();
map.forEach((key, value) -> value.forEach(val -> bList.add(new B(key, val))));