拼合一个地图<整数,列表<字符串>>地图<字符串,整数>用流和lambda

Vongo:

我想一展平Map,其相关联的Integer关键的名单String,不失键映射。我很好奇,就好像它是可能的,与这样做有用的streamlambda

我们开始是这样的:

Map<Integer, List<String>> mapFrom = new HashMap<>();

让我们假设mapFrom填充的地方,看起来像:

1: a,b,c
2: d,e,f
etc.

我们还假设,在列表中的值是唯一的。

现在,我想“展开”它得到第二张图所示:

a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.

我可以做这样的(或非常相似,使用foreach):

Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
    for (String s: entry.getValue()) {
        mapTo.put(s, entry.getKey());
    }
}

现在让我们假设,我想用拉姆达代替嵌套的for循环。我可能会做这样的事情:

Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
    e.getValue().stream().?
    // Here I can iterate on each List, 
    // but my best try would only give me a flat map for each key, 
    // that I wouldn't know how to flatten.
}).collect(Collectors.toMap(/*A String value*/,/*An Integer key*/))

我也做了尝试flatMap,但我不认为这是正确的方式去,因为虽然它帮助我摆脱了维数问题的,我失去了在这个过程中的关键。

概括地说,我的两个问题是:

  • 是否有可能使用streamslambda实现这一目标?
  • 才是有用的(性能,可读性),这样做呢?
霍尔格:

您需要使用flatMap到的数值压扁成一个新的数据流,但因为你仍然需要原始钥匙收集到Map,你必须映射到一个临时的物体保持键和值,例如

Map<String, Integer> mapTo = mapFrom.entrySet().stream()
       .flatMap(e->e.getValue().stream()
                    .map(v->new AbstractMap.SimpleImmutableEntry<>(e.getKey(), v)))
       .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));

Map.Entry是一个独立的为不存在的元组类型,能够保持不同类型的两个对象的任何其它类型的是足够的。

不需要这些临时对象的替代,是一个定制的集电极:

Map<String, Integer> mapTo = mapFrom.entrySet().stream().collect(
    HashMap::new, (m,e)->e.getValue().forEach(v->m.put(v, e.getKey())), Map::putAll);

这不同于toMap在默默覆盖重复键,而toMap无需合并功能将抛出一个异常,如果有重复键。基本上,此自定义集电极的并联能够变

Map<String, Integer> mapTo = new HashMap<>();
mapFrom.forEach((k, l) -> l.forEach(v -> mapTo.put(v, k)));

但要注意,这个任务将不会受益于并行处理,即使有非常大的输入地图。只有当有流管道,可以从SMP中受益额外的计算密集型计算任务,有从平行流得到好处的机会。因此,也许,简洁,有序集合API的解决方案是优选的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java的8个流地图<字符串,列表<字符串值>>为每个关键总和

一个文本文件转换为地图<字符串,列表<字符串>>使用lambda

如何创建列表<T>地图<字符串,T>而不是地图<字符串,列表<T >>?

变换一个List <对象>的地图<字符串,整数>使得字符串不是使用Java 8流重复值

转换字符串地图<整数,字符串>在Java 8

Java的8流,对象的转换列表地图<字符串,将<字符串>>

Java的8炼油LAMBDA地图<字符串,列表<字符串>>将字符串地图关键要求

转换地图<整数,字符串>地图<字符串,字符串>

地图<字符串,地图<字符串,租车>>到列表<汽车>使用Java 8

Java的8个流 - 查找最大计数值地图<字符串,列表<对象>>

Java流列表<地图<字符串,双>>基于字符串需要平均

Java流通过分组名单<地图<字符串,对象>>地图<整数,是List <Integer >>

收集列表<对象>地图<字符串,列表<对象>>中的Java 8中使用流

Java8流列表<地图<字符串,对象>> groupingBy和计数值

创建使用Java 8流API字符串和排序列表中的地图

如何将一个POJO的列表转换地图<字符串,列表>在Java流?

爪哇8排序HashMap中,其中地图键的目的<字符串,整数>

如何收集地图<字符串,列表<字符串>>将acheve该列表排序?

地图字符串数组列表获取键和值

将字符串,整数和数组的JSON对象解组到地图中

Groovy-地图文字中的整数或非字符串键

Concat字符串和整数流

整数和字符串

如何创建一个以字符串和整数为元素的列表?

在一个列表中分别使用字符串和整数?

Bash条件字符串和整数一起

用linq和lambda比较两个列表,其中一个是字符串,另一个是长整数

动态对象列表中的同一列具有字符串和整数

减少地图(地图(地图(列表(字符串))))地形