【问题标题】:After flattening a Java 8 multilevel map my expected result is empty展平 Java 8 多级地图后,我的预期结果为空
【发布时间】:2020-03-09 01:55:13
【问题描述】:

我有以下多级地图:

Map<String, List<Map<String, Map<String, Map<String, Map<String, String>>>>>> input =
                ImmutableMap.of("A",
                        ImmutableList.of(ImmutableMap.of("2",
                                ImmutableMap.of("3",
                                        ImmutableMap.of("4",
                                                ImmutableMap.of("5", "a"))))));

简而言之就是这样

 {
 "A":[{"2":{"3":{"4":{"5":"a"}}}}],
 "B":[{"2":{"3":{"4":{"5":"b"}}}}]
 }

我的要求是构建一张表格的地图

{
 "A":"a", 
 "B":"b"
}

我尝试了以下代码,但由于某种原因,myMap 始终为空,即使我正在填充它。我错过了什么?

Map<String, String> myMap = new HashMap<>();
input.entrySet()
                .stream()
                .map(l -> l.getValue().stream().map(m -> m.get(m.keySet().toArray()[0]))
                                .map(n -> n.get(n.keySet().toArray()[0]))
                                .map(o -> o.get(o.keySet().toArray()[0]))
                                .map(p -> myMap.put(l.getKey(), p.get(p.keySet().toArray()[0])))).collect(Collectors.toList());
System.out.println(myMap);

【问题讨论】:

    标签: java java-8 hashmap


    【解决方案1】:

    当我将两个 peek 调用添加到您的管道时,我得到了以下结果:

    input.entrySet().stream()
      .peek(System.out::println)     //<- this
      .map(l -> ...)
      .peek(System.out::println)     //<- and this
      .collect(Collectors.toList());
    

    输出:

    A=[{2={3={4={5=a}}}}]
    java.util.stream.ReferencePipeline$3@d041cf
    

    如果您注意到问题,您正在收集流,并且这些流不会通过调用终端操作来执行...当我尝试将 .count() 之类的内容添加到内部流时,您的预期输出产生:

    ...
    .map(l -> l.getValue().stream().map(m -> m.get(m.keySet().toArray()[0]))
            .map(n -> n.get(n.keySet().toArray()[0]))
            .map(o -> o.get(o.keySet().toArray()[0]))
            .map(p -> myMap.put(l.getKey(), p.get(p.keySet().toArray()[0])))
            .count()) //just an example
    ...
    

    现在,我想您知道需要调用终端操作才能运行中间操作。

    为了简化这段代码,我想你可能会对这个代码感兴趣,因为它假设树中没有集合是空的,但至少添加了记录作为一个对象,而不是一组记录(但我敢肯定,对于地图的深层地图,没有代码看起来很干净)。

    String key = input.keySet().iterator().next();
    String value = input.entrySet().iterator().next()
                    .getValue().get(0)
                    .values().iterator().next()
                    .values().iterator().next()
                    .values().iterator().next()
                    .values().iterator().next();
    myMap.put(key, value);
    

    【讨论】:

    • 感谢您的回复@ernest_k!
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 2019-08-26
    • 2016-02-18
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2019-08-25
    相关资源
    最近更新 更多