2015-01-30 14 views
25

Diciamo che ho uno Stream of Strings.Come posso negare un predicato lambda?

final Stream<String> stream = ...; 

Voglio filtrare ogni stringa vuota dopo essere ritagliata.

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

C'è un modo per applicare Predicate#negate() per la sostituzione v -> !v.isEmpty() parte?

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

risposta

26

Si dovrebbe fare .filter(((Predicate<String>) String::isEmpty).negate())

Se si desidera, è possibile definire

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

e poi

.filter(not(String::isEmpty)) 

ma vorrei solo bastone con v -> !v.isEmpty()

+15

Si potrebbe anche fare 'p.negate ritorno();' –

6

Sembra che si deve lanciare a Predicate<String> per questo al lavoro:

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

Naturalmente, sarebbe molto più breve di utilizzare una lambda, in questo caso:

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

Invece di creare classi da usare la libreria di utilità durian. Ha un sacco di methods: and, or e not naturalmente:

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

stream 
.filter(Objects::nonNull) 
.map(String::trim) 
.filter(not(String::isEmpty)); 
Problemi correlati