代码之家  ›  专栏  ›  技术社区  ›  VelNaga

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

  •  2
  • VelNaga  · 技术社区  · 7 年前

    我使用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值。我已经做到了,但格式不合适。

    预期产量: 数值:[123000]

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

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   Misha    7 年前

    不需要遍历整个映射就可以按其键找到条目。那就是 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 .

        2
  •  3
  •   VGR    7 年前

    我不确定溪流会有帮助,这里。只需循环浏览地图就更容易了:

    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());
    }
    
        3
  •  3
  •   marsouf    7 年前

    平面映射到映射流上,以获取表示所有输入映射的映射项的单个流。从那里,您可以筛选出其键不包含在所需键中的每个条目。最后,提取每个条目的等价值以将它们收集到列表中。

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