检查Java Map <T中的空条目,?延伸E>

3ya*_*uya 1 java dictionary java-stream

我有一个Map<String, ? extends Collection<SomeClass>>.我想确保没有条目集合的大小为0.所以我试过myMap.values().stream().map(Collection::size).allMatch(size -> size > 0).但是,事实证明,myMap包含空条目.

我想检查我的地图是否包含空条目:resourceMap.values().stream().noneMatch(null)但我得到了一个例外java.util.Objects.requireNonNull.

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

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

Hol*_*ger 5

您只需null使用myMap.values().contains(null)-no Stream API 检查s即可.

如果您的地图是一贯使用List或者Set,你也可以检查空值myMap.values().contains(Collections.emptySet())myMap.values().contains(Collections.emptyList()),但由于是任意的集合之间没有普遍平等的合同,这并不为你工作Map<String, ? extends Collection<SomeClass>>.

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

boolean violations = myMap.values().contains(null)
                  || myMap.values().stream().anyMatch(Collection::isEmpty);
Run Code Online (Sandbox Code Playgroud)

要么

boolean violations = myMap.values().stream().anyMatch(col -> col==null || col.isEmpty());
Run Code Online (Sandbox Code Playgroud)

当您想要循环迭代时for,您必须指定一个Collection视图Map,例如

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

或者,对于这个用例更好

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