มีวิธีการเขียนการอ้างอิงวิธีการที่อยู่ตรงข้ามของการอ้างอิงวิธีการปัจจุบัน ดูคำตอบของ @ vlasec ด้านล่างซึ่งแสดงให้เห็นว่าโดยการคัดเลือกวิธีการอ้างอิงไปยัง a Predicate
และแปลงโดยใช้negate
ฟังก์ชันอย่างชัดเจน นั่นเป็นวิธีหนึ่งในอีกสองสามวิธีที่ไม่ลำบากเกินไปที่จะทำ
ตรงข้ามกับสิ่งนี้:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
นี่คือ:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
หรือสิ่งนี้:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
โดยส่วนตัวแล้วฉันชอบเทคนิคต่อ ๆ ไปเพราะฉันเห็นว่าการอ่านชัดเจนit -> !it.isEmpty()
กว่าการใช้คำกริยาอย่างชัดเจนในระยะยาวจากนั้นคัดค้าน
เราสามารถทำเพรดิเคตและใช้ซ้ำ
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
หรือถ้ามีคอลเล็กชันหรืออาร์เรย์ให้ใช้ for-loop ซึ่งเป็นแบบง่ายมีค่าใช้จ่ายน้อยกว่าและ * อาจเร็วกว่า:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* หากคุณต้องการทราบว่าอะไรเร็วกว่านี้ให้ใช้ JMH http://openjdk.java.net/projects/code-tools/jmhและหลีกเลี่ยงรหัสเกณฑ์มาตรฐานมือยกเว้นจะหลีกเลี่ยงการเพิ่มประสิทธิภาพ JVM ทั้งหมด - ดูJava 8: ประสิทธิภาพของสตรีม vs คอลเล็กชัน
** ฉันเริ่มสะเก็ดระเบิดเพื่อบอกว่าเทคนิค for-loop เร็วขึ้น มันกำจัดการสร้างกระแสมันกำจัดโดยใช้วิธีการโทรอื่น (ฟังก์ชั่นเชิงลบสำหรับเพรดิเคต) และกำจัดรายการ / ตัวสะสมชั่วคราว ดังนั้นสิ่งเล็ก ๆ น้อย ๆ ที่ถูกบันทึกไว้โดยโครงสร้างสุดท้ายที่อาจทำให้เร็วขึ้น
ฉันคิดว่ามันง่ายและดีกว่าแม้ว่าจะไม่เร็วกว่า หากงานเรียกร้องให้ใช้ค้อนและตะปูอย่านำเลื่อยโซ่และกาวมาด้วย! ฉันรู้ว่าคุณบางคนมีปัญหากับเรื่องนี้
รายการสินค้าที่ต้องการ: ฉันต้องการเห็นStream
ฟังก์ชั่นJava พัฒนาขึ้นเล็กน้อยตอนนี้ผู้ใช้ Java คุ้นเคยกับพวกเขามากขึ้น ตัวอย่างเช่นวิธีการ 'นับ' ในสตรีมสามารถยอมรับPredicate
เพื่อให้สามารถทำสิ่งนี้ได้โดยตรงดังนี้:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
วิธีการคงที่ แต่ปัญหานั้นยังคงเปิดอยู่ดังนั้นเราจะเห็นได้เร็วที่สุดใน Java 12 (ถ้าเคย)