การกรอง LongStream [ซ้ำ]
ฉันมี Java LongStream สองรายการและฉันต้องการลบค่าที่มีอยู่ในสตรีมหนึ่งออกจากอีกสตรีม
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
LongStream ไม่มีวิธีการที่มีและฉันไม่รู้วิธีใช้ anyMatch ในกรณีนี้เนื่องจากค่าที่จะตรวจสอบนั้นมาจากสตรีมอื่นและไม่ได้อยู่ในตัวแปรหรือค่าคงที่
คำตอบ
คุณไม่สามารถค้นหาในสตรีมได้ตราบใดที่สตรีมเป็นชุดไปป์ไลน์ที่ยังไม่เสร็จสิ้นนั่นคือการดำเนินการ ไม่มีเหตุผลที่จะเปรียบเทียบกับสตรีมดังกล่าว
สิ่งต่อไปที่ดูแปลกสำหรับฉันก็คือการพิมพ์ผิด ฉันคิดว่าคุณต้องการค้นหาstream1แทนstream2ด้วยเหตุนี้:
stream2 = stream2.filter(e -> stream1.contains(e));
วิธีเดียวคือเปรียบเทียบLongStreamกับคอลเล็กชันที่เหมาะสำหรับการค้นหาดังกล่าว ฉันถือว่าคุณต้องการดำเนินการต่อstream1หลังจากที่คุณทำการค้นหาดังนั้นให้ทำตามขั้นตอนเหล่านี้:
- ปิด
stream1การแปลงเป็นList<Long> list1ไฟล์. - ดำเนินการค้นหาใน
stream2การใช้จากlist1stream1 - เปิด
stream1อีกครั้งเพื่อดำเนินการต่อไป
LongStream stream1 = ...
LongStream stream2 = ...
List<Long> list1 = stream1.boxed() // list1 from stream1 ..
.collect(Collectors.toList()); // .. which also closes stream1
stream2 = stream2.filter(list1::contains); // perform search
stream1 = list1.stream().mapToLong(l -> l); // open stream1 as LongStream
แก้ไข:ใช้Setสำหรับประสิทธิภาพที่ดีขึ้นเป็น @ เฟรมต่อวินาทีแสดงให้เห็นในของเขาคำตอบ
คุณสามารถรวบรวมSetและใช้contains:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
ทำไมต้องใช้สตรีมเลย?
คอลเลกชันมีretainAll(Collection)วิธีการที่ทำในสิ่งที่คุณต้องการถ้าฉันไม่เข้าใจผิด ...
(หรือremoveAll(Collection)เพียงเล็กน้อยด้านบน ... )