C'è un modo per comporre un riferimento di metodo che è l'opposto di un riferimento di metodo corrente. Vedi la risposta di @ vlasec di seguito che mostra come eseguire il cast esplicito del riferimento al metodo a Predicate
e quindi convertirlo utilizzando la negate
funzione. Questo è un modo tra alcuni altri modi non troppo fastidiosi per farlo.
Il contrario di questo:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
è questo:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
o questo:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
Personalmente, preferisco la tecnica successiva perché trovo più chiaro da leggere it -> !it.isEmpty()
rispetto a un cast esplicito lungo verboso e quindi negare.
Si potrebbe anche creare un predicato e riutilizzarlo:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
Oppure, se si dispone di una raccolta o di un array, utilizzare semplicemente un ciclo continuo che è semplice, ha un sovraccarico minore e * potrebbe essere ** più veloce:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* Se vuoi sapere cosa è più veloce, usa JMH http://openjdk.java.net/projects/code-tools/jmh ed evita il codice benchmark manuale a meno che non eviti tutte le ottimizzazioni JVM - vedi Java 8: performance of Streams vs Collezioni
** Mi sta venendo voglia di suggerire che la tecnica for-loop sia più veloce. Elimina la creazione di un flusso, elimina l'utilizzo di un'altra chiamata di metodo (funzione negativa per predicato) ed elimina un elenco / contatore di accumulatori temporanei. Quindi alcune cose che vengono salvate dall'ultimo costrutto potrebbero renderlo più veloce.
Penso che sia più semplice e più bello, anche se non più veloce. Se il lavoro richiede un martello e un chiodo, non introdurre motosega e colla! So che alcuni di voi mettono in dubbio questo.
lista dei desideri: Mi piacerebbe vedere le Stream
funzioni Java evolversi un po 'ora che gli utenti Java ne hanno più familiarità. Ad esempio, il metodo 'count' in Stream potrebbe accettare un Predicate
modo che questo possa essere fatto direttamente in questo modo:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
metodo statico . Ma quel problema è ancora aperto, quindi lo vedremo al più presto in Java 12 (se mai).