ฉันจะรับองค์ประกอบสุดท้ายของสตรีมหรือรายการในรหัสต่อไปนี้ได้อย่างไร
ที่ไหน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
ทุกองค์ประกอบซึ่งโดยทั่วไปแล้วคุณไม่ต้องการเนื่องจากอาจทำให้ประสิทธิภาพลดลง
Stream
API ไม่สามารถเทียบเคียงได้อย่างสมบูรณ์LINQ
เนื่องจากทั้งสองทำในกระบวนทัศน์ที่แตกต่างกันมาก มันไม่ได้แย่ลงหรือดีขึ้นเพียง แต่แตกต่างกัน และแน่นอนว่าไม่มีวิธีการบางอย่างเพราะ oracle devs ไร้ความสามารถหรือปานกลาง :)
Iterables.getLast
ซึ่งใช้เวลา IterableList
แต่มีการเพิ่มประสิทธิภาพในการทำงานด้วยgetFirst
โกรธสัตว์เลี้ยงก็คือว่ามันไม่ได้มี โดยStream
ทั่วไป API เป็นแบบทวารหนักอย่างน่ากลัวโดยไม่ต้องใช้วิธีอำนวยความสะดวกมากมาย โดย LINQ ของ C # โดย constrast ยินดีที่จะให้.Last()
และ.Last(Func<T,Boolean> predicate)
แม้ว่าจะรองรับการนับจำนวนไม่สิ้นสุดด้วย