2015-01-30 15 views
25

Lass uns sagen, ich habe einen Stream von Strings.Wie kann ich ein Lambda-Prädikat negieren?

final Stream<String> stream = ...; 

Ich möchte jede leere Zeichenfolge nach trimmen herausfiltern.

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

Gibt es eine Möglichkeit Predicate#negate() zum Ersatz v -> !v.isEmpty() Teil zu bewerben?

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

Antwort

26

würden Sie haben .filter(((Predicate<String>) String::isEmpty).negate())

tun, wenn Sie möchten, können Sie

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

definieren und dann

.filter(not(String::isEmpty)) 

aber ich würde nur Stick mit v -> !v.isEmpty()

+15

Sie könnten auch tun 'return p.negate();' –

6

Es scheint, wie Sie Predicate<String> für diese Arbeit zu werfen haben:

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

Natürlich wäre es viel kürzer sein, eine Lambda in diesem Fall zu verwenden:

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

Statt Klassen zu schaffen, durch Verwenden Sie selbst durian Dienstprogramm Bibliothek. Es hat eine Menge von methods: and, or und not natürlich:

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

stream 
.filter(Objects::nonNull) 
.map(String::trim) 
.filter(not(String::isEmpty)); 
Verwandte Themen