如果map中的任何值是空字符串或只是java8中的空白,则返回false

时间:2018-01-11 22:09:45

标签: java java-8 optional

我正在尝试编写单行代码,如果地图中的任何值为空字符串或空格字符串,则返回false。想法?

类似高级版本:

 Optional.ofNullable(map).filter(s -> s.isEmpty());

3 个答案:

答案 0 :(得分:4)

使用您当前的方法:

boolean present = 
        Optional.ofNullable(map)
                .filter(x -> 
                        x.values().stream()
                                  .noneMatch(s -> s != null && s.trim().isEmpty()))
                                  .isPresent();

或简单地说:

boolean present = map != null && 
                  map.values()
                     .stream()
                     .noneMatch(s -> s != null && s.trim().isEmpty());

答案 1 :(得分:3)

怎么样:

return map.values().stream().noneMatch(v -> v != null && v.trim().isEmpty());
如果字符串为空(v.trim().isEmpty())或仅包含空格,则

""为真。

如果流(值,此处)中没有项满足谓词,则

noneMatch为true。这是短路的,所以这也很好而有效。

答案 2 :(得分:3)

如果您只想检查是否存在空字符串,请使用

public static boolean containsNoEmptyString(Map<?,?> map) {
    return !map.containsValue("");
}

如果您想检查空白字符串,我建议

public static boolean containsNoBlankString(Map<?,String> map) {
    return map.values().stream().noneMatch(Pattern.compile("^\\s*$").asPredicate());
}

s.trim().isEmpty()这样的操作不只是检查所需的属性,而是构造一个新的字符串。创建新对象本身不是问题,即正则表达式匹配操作也可能在幕后创建对象,但是trim()操作的字符串创建的问题在于它具有可能与输入字符串。

空字符串或空字符串没有问题,因为应用trim()只会返回一个廉价的空字符串。同样,没有以空格开头或结尾的字符串也没有问题,因为trim()只返回原始字符串。

问题是可能存在非空白字符串,但以空格开头或结尾。然后,trim()将创建一个新字符串,其中包含整个字符串的 copy ,除了前导和尾随空格,并且可能是任意数量的字符。因此,此操作的潜在成本,性能和内存方式,与字符串的大小一致。

相反,正则表达式匹配操作的开销是固定的。只有实际匹配取决于字符串的长度,但即使在那里,正则表达式匹配操作也更便宜。 trim()在开头搜索空白区域,在识别出第一个非空格字符后,它将在字符串末尾搜索空白区域,以去除两者。正则表达式匹配将从头开始,但停止在第一个非空白字符处,因为该字符串不是空白。仅对于真正空白的字符串,成本将是平价的,但是在检查了任意数量的非空字符串之后,将检查地图最多只有一个空字符串,因为这是停止条件。