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



我正在尝试编写单行代码,如果映射中的任何值为空字符串或空白字符串,它将返回 false。思潮?

类似于高级版本:

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

使用您当前的方法:

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());

怎么样:

return map.values().stream().noneMatch(v -> v != null && v.trim().isEmpty());

如果字符串为空("")或仅包含空格,则为真v.trim().isEmpty()

如果流(此处为值)中没有任何项满足谓词,则noneMatch为 true。它是短路的,所以这也很好而且效率很高。

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

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()将创建一个新字符串,其中包含整个字符串的副本,前导空格和尾随空格除外,这可能是任意数量的字符。因此,此操作的潜在成本(性能和内存方面)与字符串的大小成比例。

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

最新更新