【问题标题】:Collection out of a nested HashMap从嵌套的 HashMap 中收集
【发布时间】:2019-11-24 12:50:35
【问题描述】:

考虑到 NullPointerException,我的以下代码有一点问题:

@Override
public List<FlowEdge<V>> getEdges() {
    List<FlowEdge<V>> edges = new ArrayList<FlowEdge<V>>();
    Collection<FlowEdge<V>> collection = new ArrayList<>();
    collection = graph.get(getNodes()).values();
    edges.addAll(collection);
    return edges;
}

我知道这可以写得更短一些,但我想稍微拆分一下代码以找出我在哪里得到 NullPointerException。所以问题出在“collection =...”这一行。

Graph 是一个嵌套的 HashMap:

Map&lt;V, Map&lt;V, FlowEdge&lt;V&gt;&gt; graph = new HashMap&lt;&gt;();

和 getNodes() 是在同一类中返回集合的方法。我已经测试过 getNodes() 是否提供了一个空集,但事实并非如此。

@Override
public Set<V> getNodes() {
    Set<V> set = graph.keySet();
    return set; 
}

提前谢谢你。

【问题讨论】:

  • 当您在下一行覆盖像collection = graph.get(getNodes()).values(); 这样的变量时,初始化collection = new ArrayList&lt;&gt;(); 没有任何意义。除此之外,如果该行证明为NullPointerException,则该行中取消引用的值之一必须是nullgraphget 返回的值。当graphgetNodes() 方法中的graph 相同时,您正在执行graph.get(graph.keySet()),这没有任何意义,并且将始终返回null

标签: java collections hashmap


【解决方案1】:

graph 映射的键是V 类型,因此将Set&lt;V&gt; 传递给Mapget() 方法将始终返回null

如果要获取内部Maps的所有FlowEdge&lt;V&gt;值,可以这样写:

List<FlowEdge<V>> collection =
    graph.values() // a Collection<Map<V, FlowEdge<V>>
         .stream() // a Stream<Map<V, FlowEdge<V>>
         .flatMap(m -> m.values().stream()) // a Stream<FlowEdge<V>>
         .collect(Collectors.toList()); // a List<FlowEdge<V>>

编辑:

请注意,上面的 sn-p 是一条语句。为了可读性,它只分为多行。

同样可以写在一行代码中:

List<FlowEdge<V>> collection = graph.values().stream().flatMap(m -> m.values().stream()).collect(Collectors.toList());

【讨论】:

  • 使用 values() 表示:Type mismatch: cannot convert from Collection&lt;Map&lt;V,FlowEdge&lt;V&gt;&gt;&gt; to List&lt;FlowEdge&lt;V&gt;&gt; 使用 .stream() 表示:``` 对于 Map>>``` 使用 .flatMap(...) 表示:The method flatMap((&lt;no type&gt; m) -&gt; {}) is undefined for the type Map&lt;V,Map&lt;V,FlowEdge&lt;V&gt;&gt;&gt; 使用 .collect(...) 表示:``` 方法 collect(Collectors.toList()) 未定义 Map 类型>> ``` 这些已经是其他方法,但不幸的是仍然没有解决方案。您还有其他建议吗?
  • 我正在使用带有 openJDK 12.0.2 的 Eclipse(这是我在这个项目中必须使用的)
  • @Peerius 这个答案向您展示了应该作为一个整体使用的一个解决方案,而不是您必须一个接一个地尝试的四个解决方案。
  • @Holger 哦,这就是 OP 在该评论中的意思。我会澄清我的答案。谢谢。
  • @Eran 好吧,我是从按原样使用您的代码时无法获得的错误消息推断出来的(并且不可能同时获得所有这些错误消息)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多