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

How to collect data to List<Object> from Map<Object,Integer> using java Stream API?

我有包含对象及其计数的地图 Map<Nominal, Integer>

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

我需要从中得到这样一个 List<Nominal>:

a
a
a
b
c
c

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

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

List<Nominal> expanded = map.entrySet().stream()
  .flatMap(e -> generate(e::getKey).limit(e.getValue()))
  .collect(toList());

我们可以使用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 demo


备注

在演示中,我将 Map 的键类型从 Nominal 更改为 Object,因为未提供 Nominal 的定义。但是,更改密钥类型不会影响解决方案。