Geçerli bir yöntem başvurusunun tersi olan bir yöntem başvurusu oluşturmanın bir yolu vardır. Aşağıdaki yöntem başvurusunu açık bir şekilde a Predicate
ve ardından negate
işlevi kullanarak dönüştürerek gösteren @ vlasec'in cevabına bakın . Bunu yapmak için çok sıkıntılı olmayan birkaç yol arasında bir yol budur.
Bunun tam tersi:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
bu:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
veya bu:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
Şahsen, daha sonraki tekniği tercih ederim çünkü okumayı it -> !it.isEmpty()
uzun ve ayrıntılı bir kadrodan daha net buluyorum ve sonra reddediyorum.
Ayrıca bir öngörüde bulunabilir ve yeniden kullanabilir:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
Veya, bir koleksiyona veya diziye sahipseniz, basit, daha az ek yükü olan ve * daha hızlı olabilecek bir for-loop kullanın:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* Neyin daha hızlı olduğunu bilmek istiyorsanız, JMH http://openjdk.java.net/projects/code-tools/jmh kullanın ve tüm JVM optimizasyonlarından kaçınmadıkça el kıyaslama kodundan kaçının - bkz. Java 8: Akışların performansı vs Koleksiyonlar
** For-loop tekniğinin daha hızlı olduğunu öne sürdüğüm için pullanıyorum. Bir akış oluşturmayı ortadan kaldırır, başka bir yöntem çağrısı (yüklem için negatif işlev) kullanmayı ortadan kaldırır ve geçici bir akümülatör listesini / sayacını ortadan kaldırır. Son yapı tarafından kaydedilen ve daha hızlı hale getirebilecek birkaç şey.
Ben daha hızlı olmasa bile, daha basit ve daha güzel olduğunu düşünüyorum. İş bir çekiç ve çivi gerektiriyorsa, motorlu testere ve tutkal getirmeyin! Bazılarınızın bununla ilgili olduğunu biliyorum.
İstek listesi: Stream
Java kullanıcılarının biraz daha evrim geçirdiğini görmek istiyorum . Örneğin, Stream'deki 'count' yöntemi Predicate
, bunun doğrudan şu şekilde yapılabilmesi için bir kabul edebilir:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
yöntemin eklenmesini kapsar . Ancak bu sorun hala açık, bu yüzden bunu en erken Java 12'de görüyoruz (eğer varsa).