【问题标题】:Check for null entries in Java Map<T, ? extends E>检查 Java Map<T, 中的空条目?扩展 E>
【发布时间】:2017-08-07 17:12:46
【问题描述】:

我有一个Map&lt;String, ? extends Collection&lt;SomeClass&gt;&gt;。我想确保没有集合大小为 0 的条目。因此我尝试了myMap.values().stream().map(Collection::size).allMatch(size -&gt; size &gt; 0)。然而,事实证明,myMap 包含空条目。

我想检查我的地图是否包含空条目:resourceMap.values().stream().noneMatch(null),但出现异常 java.util.Objects.requireNonNull

我决定以一种相对老式的方式来做,使用 for-in 循环 for (Map.Entry&lt;String, ? extends Collection&gt; entry : myMap) 但是,我收到一个编译错误,告诉我 foreach 不适用于我的地图。

检查我的地图中的所有条目是否不为空且大小> 0的优雅方法是什么?

【问题讨论】:

  • .map(CollectionUtils::isNotEmpty) 来自 commons-lang
  • 请出示您的for each ;)
  • 对于地图,您应该使用map.entrySet(),然后在地图条目对象上进行迭代。

标签: java dictionary java-stream


【解决方案1】:

您可以使用myMap.values().contains(null) 来检查nulls — 不需要 Stream API。

如果您的地图一直使用ListSet,您还可以使用myMap.values().contains(Collections.emptySet())myMap.values().contains(Collections.emptyList()) 检查空值,但由于任意集合之间没有普遍的平等契约,这不起作用为您的Map&lt;String, ? extends Collection&lt;SomeClass&gt;&gt;

所以对于这个特定的测试,你可以使用

boolean violations = myMap.values().contains(null)
                  || myMap.values().stream().anyMatch(Collection::isEmpty);

boolean violations = myMap.values().stream().anyMatch(col -> col==null || col.isEmpty());

当您想使用for 循环进行迭代时,您必须在Map 上指定一个集合视图,例如

Map<String, ? extends Collection<SomeClass>> myMap;
…
for (Map.Entry<String, ? extends Collection<?>> entry: myMap.entrySet())
    // loop body

或者,对于这个用例来说更好

for(Collection<?> value: myMap.values())
    if(value == null || value.isEmpty())
        // violation detected, perform your action

【讨论】:

    【解决方案2】:

    如果您查看实际的方法签名:

    boolean noneMatch(Predicate<? super T> predicate)
    

    您将看到noneMatch(null) 接受Predicate 实例而不是实际值。这里禁止使用空谓词。

    试试:

    boolean result = resourceMap.values().stream()
      .noneMatch(Objects::isNull)
    

    您可以将这两个合并为一个链:

    myMap.values().stream()
      .allMatch(col -> col != null && col.size() > 0);
    

    【讨论】:

    • 谢谢!我无法组合它,因为如果我的地图包含空条目,但非空条目的大小> 0,它会评估为真。我只会将它们与经典的 && 结合起来。
    • @3yakuya 当然,我现在明白了。我认为为此使用一个流是可行的。让我试试。
    • @3yakuya 你可以直接.allMatch(col -&gt; col != null &amp;&amp; col.size() &gt; 0);
    • 不错!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-12-18
    • 2021-08-16
    • 1970-01-01
    • 2014-04-14
    • 2011-02-02
    • 2014-12-08
    相关资源
    最近更新 更多