2015-01-30 9 views
25

Powiedzmy, że mam strumień ciągów.Jak mogę zanegować orzeczenie lambda?

final Stream<String> stream = ...; 

Chcę odfiltrować każdy pusty ciąg po przycięciu.

stream 
    .filter(Objects::nonNull) 
    .map(String::trim) 
    .filter(v -> !v.isEmpty()); 

Czy istnieje jakiś sposób, aby zastosować Predicate#negate() zastąpienia v -> !v.isEmpty() udział?

.filter(((Predicate) String::isEmpty).negate()) // not compile 

Odpowiedz

26

Trzeba by zrobić .filter(((Predicate<String>) String::isEmpty).negate())

Jeśli chcesz, możesz zdefiniować

static<T> Predicate<T> not(Predicate<T> p) { 
    return t -> !p.test(t); 
} 

a następnie

.filter(not(String::isEmpty)) 

ale chciałbym po prostu trzymać się v -> !v.isEmpty()

+15

Można również zrobić 'p.negate Powrót();' –

6

Wydaje się, że masz do oddania do Predicate<String> za to do pracy:

.filter(((Predicate<String>) (String::isEmpty)).negate()) 

Oczywiście, byłoby znacznie krótszy używać lambda w tym przypadku:

.filter(s -> ! s.isEmpty()) 
2

Zamiast tworzyć zajęcia przez sam skorzystaj z biblioteki narzędziowej durian. Ma dużo methods: and, or i not przedmiotu:

import static com.diffplug.common.base.Predicates.not; 

stream 
.filter(Objects::nonNull) 
.map(String::trim) 
.filter(not(String::isEmpty)); 
Powiązane problemy