我正在尝试编写单行代码,如果地图中的任何值为空字符串或空格字符串,则返回false。想法?
类似高级版本:
Optional.ofNullable(map).filter(s -> s.isEmpty());
答案 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()
在开头搜索空白区域,在识别出第一个非空格字符后,它将在字符串末尾搜索空白区域,以去除两者。正则表达式匹配将从头开始,但停止在第一个非空白字符处,因为该字符串不是空白。仅对于真正空白的字符串,成本将是平价的,但是在检查了任意数量的非空字符串之后,将检查地图最多只有一个空字符串,因为这是停止条件。