Es gibt eine Möglichkeit, eine Methodenreferenz zu erstellen, die das Gegenteil einer aktuellen Methodenreferenz ist. Die Antwort von @ vlasec unten zeigt, wie Sie die Methodenreferenz explizit in a Predicate
umwandeln und sie dann mithilfe der negate
Funktion konvertieren . Das ist ein Weg unter ein paar anderen, nicht allzu mühsamen Wegen, dies zu tun.
Das Gegenteil davon:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
ist das:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
oder dieses:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
Persönlich bevorzuge ich die spätere Technik, weil ich es klarer finde, zu lesen it -> !it.isEmpty()
als eine lange ausführliche explizite Besetzung und dann zu negieren.
Man könnte auch ein Prädikat erstellen und es wiederverwenden:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
Wenn Sie über eine Sammlung oder ein Array verfügen, verwenden Sie einfach eine for-Schleife, die einfach ist, weniger Overhead hat und * möglicherweise ** schneller ist:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* Wenn Sie wissen möchten, was schneller ist, verwenden Sie JMH http://openjdk.java.net/projects/code-tools/jmh und vermeiden Sie Hand-Benchmark-Code, es sei denn, es vermeidet alle JVM-Optimierungen - siehe Java 8: Leistung von Streams vs Sammlungen
** Ich bekomme Flak, weil ich behaupte, dass die For-Loop-Technik schneller ist. Es eliminiert eine Stream-Erstellung, es eliminiert die Verwendung eines anderen Methodenaufrufs (negative Funktion für Prädikat) und es eliminiert eine temporäre Akkumulatorliste / Zähler. Also ein paar Dinge, die vom letzten Konstrukt gespeichert werden und die es möglicherweise schneller machen.
Ich denke, es ist einfacher und schöner, wenn auch nicht schneller. Wenn der Job einen Hammer und einen Nagel erfordert, bringen Sie keine Kettensäge und keinen Kleber mit! Ich weiß, dass einige von Ihnen Probleme damit haben.
Wunschliste: Ich würde gerne sehen, dass sich die Java- Stream
Funktionen etwas weiterentwickeln, da Java-Benutzer mit ihnen besser vertraut sind. Zum Beispiel könnte die 'count'-Methode in Stream a akzeptieren, Predicate
so dass dies direkt wie folgt erfolgen kann:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
Methode. Dieses Problem ist jedoch noch offen, sodass wir es frühestens in Java 12 sehen werden (falls überhaupt).