การกรอง LongStream [ซ้ำ]

Dec 01 2020

ฉันมี Java LongStream สองรายการและฉันต้องการลบค่าที่มีอยู่ในสตรีมหนึ่งออกจากอีกสตรีม

LongStream stream 1 = ...
LongStream stream 2 = ...

stream2  = stream2.filter(e-> stream1.contains(e));

LongStream ไม่มีวิธีการที่มีและฉันไม่รู้วิธีใช้ anyMatch ในกรณีนี้เนื่องจากค่าที่จะตรวจสอบนั้นมาจากสตรีมอื่นและไม่ได้อยู่ในตัวแปรหรือค่าคงที่

คำตอบ

1 NikolasCharalambidis Dec 01 2020 at 13:59

คุณไม่สามารถค้นหาในสตรีมได้ตราบใดที่สตรีมเป็นชุดไปป์ไลน์ที่ยังไม่เสร็จสิ้นนั่นคือการดำเนินการ ไม่มีเหตุผลที่จะเปรียบเทียบกับสตรีมดังกล่าว

สิ่งต่อไปที่ดูแปลกสำหรับฉันก็คือการพิมพ์ผิด ฉันคิดว่าคุณต้องการค้นหาstream1แทนstream2ด้วยเหตุนี้:

stream2 = stream2.filter(e -> stream1.contains(e));

วิธีเดียวคือเปรียบเทียบLongStreamกับคอลเล็กชันที่เหมาะสำหรับการค้นหาดังกล่าว ฉันถือว่าคุณต้องการดำเนินการต่อstream1หลังจากที่คุณทำการค้นหาดังนั้นให้ทำตามขั้นตอนเหล่านี้:

  1. ปิดstream1การแปลงเป็นList<Long> list1ไฟล์.
  2. ดำเนินการค้นหาในstream2การใช้จากlist1stream1
  3. เปิด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สำหรับประสิทธิภาพที่ดีขึ้นเป็น @ เฟรมต่อวินาทีแสดงให้เห็นในของเขาคำตอบ

3 fps Dec 01 2020 at 13:48

คุณสามารถรวบรวมSetและใช้contains:

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

ทำไมต้องใช้สตรีมเลย?

คอลเลกชันมีretainAll(Collection)วิธีการที่ทำในสิ่งที่คุณต้องการถ้าฉันไม่เข้าใจผิด ...
(หรือremoveAll(Collection)เพียงเล็กน้อยด้านบน ... )