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

时间:2016-02-09 01:24:56

标签: java java-stream

给定Map将字符串映射到List,有没有办法使用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可以执行相同的首次停止工作(“短路”操作),那将是很好的。

3 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:17)

使用the anyMatch method查找流的任何元素是否与Predicate匹配。在这里,您的谓词是条目的值(列表)不为空。

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

答案 2 :(得分:0)

int size = Map.entrySet().stream()
                           .map(entry -> entry.getValue())
                           .flatMap(list -> list.stream())
                           .size();
if(size==0)
  return Boolean.False;
else
  return Boolean.True;

这段代码很简单,对您的工作有帮助。