Как я могу свести на нет лямбда-предикат?
Допустим, у меня есть Stream of Strings.
final Stream<String> stream = ...;
Я хочу отфильтровать каждую пустую строку после обрезки.
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(v -> !v.isEmpty());
Можно ли применить Predicate # negate() для замены v -> !v.isEmpty()
part?
.filter(((Predicate) String::isEmpty).negate()) // not compile
Ответы
Ответ 1
Вам нужно будет сделать .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()
Ответ 2
Кажется, что вам нужно нажать Predicate<String>
для этого:
.filter(((Predicate<String>) (String::isEmpty)).negate())
Конечно, было бы гораздо меньше использовать лямбда в этом случае:
.filter(s -> ! s.isEmpty())
Ответ 3
Вместо того, чтобы самостоятельно создавать классы, используйте durian. В нем много методов : and
, or
и not
, конечно:
import static com.diffplug.common.base.Predicates.not;
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(not(String::isEmpty));