如果Map中的所有List值都为空/非空,则使用Streams返回Boolean

Bas*_*que 27 java java-stream

给定一个MapString到a 的映射List,有没有办法使用Java Streams返回一个布尔值,其中TRUE表示一个或多个列表有元素?如果地图中的所有列表都为空,则返回FALSE.

Map< String , List<String> > map = …
Run Code Online (Sandbox Code Playgroud)

可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们可以在第一次发现后突破检查.无需检查所有Map值(所有列表).如果为了效率,Stream可以执行相同的首次停止工作("短路"操作),那将是很好的.

Pet*_*rey 34

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

 boolean anyNonEmpty = !map.values().stream().allMatch(List::isEmpty);
Run Code Online (Sandbox Code Playgroud)

  • @BasilBourque`allMatch`方法也是短路的. (5认同)
  • @Basil Bourque:不要使用方法名称,请[文档](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#allMatch- java.util.function.Predicate-):"*这是一个短路终端操作.*" (2认同)

rge*_*man 18

使用anyMatch方法是发现,如果流中的任何元素相匹配的Predicate.这里,您的谓词是条目的值(列表)不为空.

boolean anyNonEmpty = map.entrySet()
    .stream()
    .anyMatch(entry -> !entry.getValue().isEmpty());
Run Code Online (Sandbox Code Playgroud)

  • @rgettman:你可以用 `values` 替换 `entrySet`,然后在谓词中直接转到 `!list.isEmpty` ;-)。顺便说一句,即使是问题的代码也已经使用了 `values()`。 (2认同)