Java8将映射列表转换为字符串列表

Java8将映射列表转换为字符串列表,java,java-8,Java,Java 8,我正在使用Java8实现以下功能 Map<String, String> m0 = new HashMap<>(); m0.put("x", "123"); m0.put("y", "456"); m0.put("z", "789"); Map<String, String> m1 = new HashMap<>(); m1.put("x", "000");

我正在使用Java8实现以下功能

 Map<String, String> m0 = new HashMap<>();
        m0.put("x", "123");
        m0.put("y", "456");
        m0.put("z", "789");

        Map<String, String> m1 = new HashMap<>();
        m1.put("x", "000");
        m1.put("y", "111");
        m1.put("z", "222");

        List<Map<String, String>> l = new ArrayList<>(Arrays.asList(m0, m1));

        List<String> desiredKeys = Lists.newArrayList("x");

        List<Map<String, String>> transformed = l.stream().map(map -> map.entrySet().stream()
                .filter(e -> desiredKeys.stream().anyMatch(k -> k.equals(e.getKey())))
                .collect(Collectors.toMap(e -> e.getKey(), p -> p.getValue())))
                .filter(m -> !m.isEmpty())
                .collect(Collectors.toList());
        System.err.println(l);
        System.err.println(transformed);
        List<String> values = new ArrayList<>();
        for (Map<String,String> map : transformed) {
            values.add(map.values().toString());
            System.out.println("Values inside map::"+map.values());
        }
        System.out.println("values::"+values); //values::[[123], [000]]
Map m0=newhashmap();
m0.put(“x”,“123”);
m0.put(“y”,“456”);
m0.put(“z”,“789”);
Map m1=新的HashMap();
m1.投入(“x”,“000”);
m1.投入(“y”、“111”);
m1.投入(“z”、“222”);
列表l=新的ArrayList(Arrays.asList(m0,m1));
List desiredKeys=Lists.newArrayList(“x”);
List transformed=l.stream().map(map->map.entrySet().stream())
.filter(e->desiredKeys.stream().anyMatch(k->k.equals(e.getKey()))
.collect(Collectors.toMap(e->e.getKey(),p->p.getValue()))
.filter(m->!m.isEmpty())
.collect(Collectors.toList());
系统错误println(l);
系统错误打印项次(已转换);
列表值=新的ArrayList();
对于(贴图:已转换){
add(map.values().toString());
System.out.println(“映射内的值::”+map.Values());
}
System.out.println(“值::”+值)//值:[[123],[000]]
这里,我只想从列表中获取x值。我已经做到了,但它不是一个适当的格式

预期产出: 值::[123000]

实际产量: 值:[[123],[000]]


我知道如何修正实际输出。但有什么简单的方法可以解决这个问题吗?任何帮助都是值得的。

我不确定Streams是否会有所帮助。只需在地图中循环即可轻松完成:

Collection<String> values = new ArrayList<>();

for (Map<String, String> map : l) {
    Map<String, String> copy = new HashMap<>(map);
    copy.keySet().retainAll(desiredKeys);
    values.addAll(copy.values());
}
Collection values=new ArrayList();
用于(地图:l){
映射副本=新哈希映射(Map);
copy.keySet().retainal(需要的键);
values.addAll(copy.values());
}

您不需要遍历整个映射,就可以通过其键找到条目。这就是
Map.get
的作用。要展平值列表,请使用
flatMap

import static java.util.stream.Collectors.toList;
.....

List<String> values = l.stream()
    .flatMap(x -> desiredKeys.stream()
            .filter(x::containsKey)
            .map(x::get)
    ).collect(toList());
导入静态java.util.stream.Collectors.toList;
.....
列表值=l.stream()
.flatMap(x->desiredKeys.stream()
.filter(x::containsKey)
.map(x::get)
).collect(toList());

在旁注中,避免使用
l
(小写l)作为变量名。它看起来太像地图流上的数字
1

平面地图,无法获得表示所有输入地图的地图条目的单个流。从那里,您可以筛选出每个项,这些项的键不包含在所需的键中。最后,提取每个条目的等效值以将其收集到列表中

final List<String> desiredValues = l.stream()
    .map(Map::entrySet)
    .flatMap(Collection::stream)
    .filter(entry -> desiredKeys.contains(entry.getKey()))
    .map(Map.Entry::getValue)
    .collect(Collectors.toList());
final List desiredValues=l.stream()
.map(map::entrySet)
.flatMap(集合::流)
.filter(entry->desiredKeys.contains(entry.getKey()))
.map(map.Entry::getValue)
.collect(Collectors.toList());
编辑

这假设如果一个映射有键“x”,那么它也必须有键“y”,以便获取相应的值

final List<String> desiredValues = l.stream()
    .filter(map -> map.containsKey("x"))
    .map(map -> map.get("y"))
    .collect(Collectors.toList());
final List desiredValues=l.stream()
.filter(map->map.containsKey(“x”))
.map(map->map.get(“y”))
.collect(Collectors.toList());

单独使用两个视图比streams更优雅,如果我还剩下一些,我会投票:)如果所需的关键点数量明显小于原始地图大小,那么首先复制整个地图可能会很昂贵。如果源映射是可变的,并且它们的原始内容不是必需的,因此不需要复制,那么您的解决方案就有了一点。@Holger复制整个映射意味着只复制对键和值的引用。相对而言,即使对于大型地图,内存使用也不多。不幸的是,它并没有那么简单
HashMap
不仅在引擎盖下创建一个数组,而且为每个映射创建一个
Entry
实例。不过,我实际上关注的是CPU开销,因为
HashMap
没有廉价的映射传输方式,即使源代码已经是
HashMap
的一个实例。因此,复制整个映射意味着散列所有条目,而不是只查找每个所需的键。是否可能基于“x”键获取“y”值?是否可能基于“x”键获取“y”值?@VelNaga您能澄清一下吗?您希望输出是什么?如果映射中存在X值,则返回Y值。对于ex)取第一个映射,我将检查“X”值“123”,如果存在,则返回Y值“456”。因此,如果映射同时包含键“X”和键“Y”,则您希望返回键“Y”的值?是的,基于X值是否可以基于“X”获取“Y”值key?@VelNaga你的意思是获取项,其键为“x”,值为“y”?如果映射具有值“x”,则获取值“y”,如果映射中存在x值,则返回y值。例如)获取第一个映射,我将检查“x”值“123”,如果存在,则返回y值“456”