如果 Map 中的所有 List 值都为空/非空,则使用流返回布尔值Stream::allMatch

2022-09-01 03:38:35

给定一个将字符串映射到列表Map,有没有办法使用 Java Streams 返回一个布尔值,其中 TRUE 表示一个或多个列表具有元素?如果映射中的所有列表都为空,则返回 FALSE。

Map< String , List<String> > map = …

使用Streams可以取代这种传统代码吗?

// See if any diffs were found. Loop through the Map, look at each List of diffs to see if non-empty.
boolean anyElementsInAnyList = false;
for (List<String> list : map.values () ) {
    if (!list.isEmpty()) {
        anyElementsInAnyList = true;
        break;
    }
}

请注意,我们可以在第一次发现后突破检查。无需检查所有 Map 值(所有列表)。如果为了提高效率,Stream可以执行相同的“首次查找时停止工作”(“短路”操作)会很好。


答案 1

Stream::allMatch

在 Java 8 中,您可以检查并非所有列表都是空的。

 boolean anyNonEmpty = !map.values().stream().allMatch(List::isEmpty);

请注意,Stream::allMatch 是一个短路终端操作。因此,流是高效的,不会运行超过所需的时间。


答案 2

使用 anyMatch 方法查找流中是否有任何元素与 .在这里,您的谓词是条目的值(列表)不为空。Predicate

boolean anyNonEmpty = map.entrySet()
    .stream()
    .anyMatch(entry -> !entry.getValue().isEmpty());

推荐