我将尝试写一行代码,如果map中的任何值为空字符串或空格字符串,则返回false。有何想法?
类似于以下高级版本:
Optional.ofNullable(map).filter(s -> s.isEmpty());
我将尝试写一行代码,如果map中的任何值为空字符串或空格字符串,则返回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());
如果你只是想检查空字符串是否存在,可以使用以下方法:
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()
在开头搜索空格,并在识别第一个非空格字符后搜索字符串末尾的空格,以剥离两者。正则表达式匹配将从开头开始,但在第一个非空格字符处停止,因为此时字符串不为空白。只有对于真正的空白字符串,成本才会相当,但最多只会检查一个空白字符串的映射,因为这是停止条件,在检查任意数量的非空白字符串后达到该条件。return map.values().stream().noneMatch(v -> v != null && v.trim().isEmpty());
v.trim().isEmpty()
是当字符串为空(""
)或仅包含空格时返回true。
noneMatch
是当流中的所有项(这里是值)都不满足谓词时返回true。由于它是短路运算,因此它非常高效。
s != null && s.isEmpty() ||
是多余的。如果字符串为空,则trim()
返回相同的字符串。但是在第二种情况下,s.trim().isEmpty()
更加整洁。 - Andy Turners.trim()
总是会构造一个新的字符串对象,因此在调用它之前进行了检查。尽管如此,你是正确的,我已经修改了。感谢 :). - Ousmane D.b ? Integer.valueOf(0) : Long.valueOf(0)
的问题,导致了有趣的类型?我为此编写了一个 Error Prone 检查 - 并且实际上在 openjdk 中发现了一个 bug!我提到这件事是因为我记得你曾经评论过这个问题非常奇怪。 - Andy Turner