如何使用 Stream API 将数据从 Map<Object> 收集到 List<Object, Integer>?

问题描述 投票:0回答:2

我有地图

Map<Nominal, Integer>
,上面有物体及其数量:

a -> 3
b -> 1
c -> 2

我需要从中得到这样的

List<Nominal>

a
a
a
b
c
c

如何使用 Stream API 执行此操作?

java dictionary collections java-stream
2个回答
7
投票

我们可以使用

Collections::nCopies
来达到我们想要的结果:

private static <T> List<T> transform(Map<? extends T, Integer> map) {
  return map.entrySet().stream()
      .map(entry -> Collections.nCopies(entry.getValue(), entry.getKey()))
      .flatMap(Collection::stream)
      .collect(Collectors.toList());
}

Ideone 演示


备注

在演示中,由于未提供

Map
的定义,我将
Nominal
的键类型从
Object
更改为
Nominal
。然而,更改密钥类型不会影响解决方案。


1
投票

流式传输条目并使用 flatMap 根据值生成每个键的多个副本。

List<Nominal> expanded = map.entrySet().stream()
  .flatMap(e -> generate(e::getKey).limit(e.getValue()))
  .collect(toList());
© www.soinside.com 2019 - 2024. All rights reserved.