ฉันจะรับองค์ประกอบสุดท้ายของสตรีมหรือรายการในรหัสต่อไปนี้ได้อย่างไร
ที่ไหนdata.careasเป็นList<CArea>:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
อย่างที่คุณเห็นการรับองค์ประกอบแรกด้วยองค์ประกอบบางอย่างfilterไม่ใช่เรื่องยาก
อย่างไรก็ตามการได้รับองค์ประกอบสุดท้ายในหนึ่งซับเป็นความเจ็บปวดอย่างแท้จริง:
- ดูเหมือนว่าฉันไม่สามารถรับได้โดยตรงจากไฟล์
Stream. (มันจะสมเหตุสมผลสำหรับสตรีมที่ จำกัด เท่านั้น) - ดูเหมือนว่าคุณไม่สามารถรับสิ่งต่างๆเช่น
first()และlast()จากListอินเทอร์เฟซได้ซึ่งเป็นความเจ็บปวดจริงๆ
ฉันไม่เห็นอาร์กิวเมนต์ใด ๆ ที่ไม่ให้ a first()และlast()method ในListอินเทอร์เฟซเนื่องจากองค์ประกอบในนั้นได้รับคำสั่งและยิ่งกว่านั้นขนาดก็เป็นที่รู้จัก
แต่ตามคำตอบเดิม: จะได้รับองค์ประกอบสุดท้ายของ จำกัด ได้Streamอย่างไร?
โดยส่วนตัวแล้วนี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับ:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
อย่างไรก็ตามมันเกี่ยวข้องกับการใช้indexOfทุกองค์ประกอบซึ่งโดยทั่วไปแล้วคุณไม่ต้องการเนื่องจากอาจทำให้ประสิทธิภาพลดลง
StreamAPI ไม่สามารถเทียบเคียงได้อย่างสมบูรณ์LINQเนื่องจากทั้งสองทำในกระบวนทัศน์ที่แตกต่างกันมาก มันไม่ได้แย่ลงหรือดีขึ้นเพียง แต่แตกต่างกัน และแน่นอนว่าไม่มีวิธีการบางอย่างเพราะ oracle devs ไร้ความสามารถหรือปานกลาง :)
Iterables.getLastซึ่งใช้เวลา IterableListแต่มีการเพิ่มประสิทธิภาพในการทำงานด้วยgetFirstโกรธสัตว์เลี้ยงก็คือว่ามันไม่ได้มี โดยStreamทั่วไป API เป็นแบบทวารหนักอย่างน่ากลัวโดยไม่ต้องใช้วิธีอำนวยความสะดวกมากมาย โดย LINQ ของ C # โดย constrast ยินดีที่จะให้.Last()และ.Last(Func<T,Boolean> predicate)แม้ว่าจะรองรับการนับจำนวนไม่สิ้นสุดด้วย