假设我有一串字符串。
final Stream<String> stream = ...;
我想在修剪后过滤掉每个空字符串。
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(v -> !v.isEmpty());
有没有办法将Predicate#negate()用于替换v -> !v.isEmpty()
部分?
.filter(((Predicate) String::isEmpty).negate()) // not compile
答案 0 :(得分:28)
您必须.filter(((Predicate<String>) String::isEmpty).negate())
如果需要,您可以定义
static<T> Predicate<T> not(Predicate<T> p) {
return t -> !p.test(t);
}
然后
.filter(not(String::isEmpty))
但我会坚持使用v -> !v.isEmpty()
答案 1 :(得分:7)
似乎你必须强制转换为Predicate<String>
才能使其工作:
.filter(((Predicate<String>) (String::isEmpty)).negate())
当然,在这种情况下使用lambda会短得多:
.filter(s -> ! s.isEmpty())
答案 2 :(得分:2)