Подтвердить что ты не робот

Как я могу свести на нет лямбда-предикат?

Допустим, у меня есть 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
4b9b3361

Ответ 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));