Java8将Map列表转换为字符串列表

时间:2018-07-25 15:27:43

标签: 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");
        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]]

在这里,我只想从列表中获取x值。我已经实现了,但是格式不正确。

预期输出: 值:: [123,000]

实际输出: 值:: [[123],[000]]

我知道如何解决实际输出。但是,有没有简单的方法可以解决此问题?任何帮助都是可观的。

3 个答案:

答案 0 :(得分:4)

您无需遍历整个地图即可通过其键查找条目。这就是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());

另一方面,请避免将l(小写L)用作变量名。看起来太像数字1

答案 1 :(得分:3)

我不确定在这里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());
}

答案 2 :(得分:3)

在地图流上绘制平面地图,以获取代表所有输入地图的地图项的单个流。从那里,您可以过滤出所需键中未包含其键的每个条目。最后,提取每个条目的等效值以将它们收集到列表中。

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());

编辑

这假定如果地图具有键“ x”,则它还必须具有键“ y”,以便获取对应的值。

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