Java 8: วิธีปฏิบัติที่ดีในการส่งผ่านสตรีมใน API สำหรับการดำเนินการที่ไม่ราบรื่นหรือไม่


12

ในไลบรารี pre-Java 8 lambda-heavy เช่น Guava เอาต์พุตใช้อินเตอร์เฟส Java Collection Framework ทั่วไปดังนั้นจึงง่ายต่อการส่งไปยัง API ภายนอก / ภายในและยังคงควบคุมการคำนวณแบบสันหลังยาวหากวิธีไลบรารีทำเช่นนั้น (ขี้เกียจfilter()และtransform())

อย่างไรก็ตามใน Java 8 Streams การเรียกรับ a Collection/ Mapis terminal (เช่นกระตือรือร้น) และจะจัดสรรโครงสร้างข้อมูลใหม่เพื่อเก็บผลลัพธ์

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

ดังนั้นผู้คนคิดว่าเป็นวิธีปฏิบัติที่ดีสำหรับ API ภายใน (เช่นกลยุทธ์รูปแบบกลยุทธ์) ในการรับและส่งคืนStreamหรือฉันควรย้อนกลับไปยังคนขี้เกียจ แต่ไม่คล่องตัว (คิดว่าฉันเดา) API ของ Guava

แก้ไข:

ความกังวลหลักของฉันStreamคือมันสามารถบริโภคได้เพียงครั้งเดียวและผ่านบางสิ่งบางอย่างเช่นSupplier<Stream<X>>ดูยุ่งยากมาก มันเกือบจะผลักดันให้คุณเพิ่งผ่านCollectionและกลับมาอีกครั้งstream()(และจ่ายค่าใช้จ่ายในการประเมินความกระตือรือร้นที่จุดนั้น)


อะไร Guava & เพื่อนไม่ได้รับการอัปเดตเพื่อใช้ประโยชน์จากสตรีมดั้งเดิม
Kilian Foth

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

@KilianFoth ยังไม่มี Guava รีลีสใด ๆ เป็นเวลาเกือบหนึ่งปีและมีบทความยอดนิยมมากมายเกี่ยวกับการแทนที่แลมบ์ดาของ Guava ด้วย Stream; อย่างไรก็ตามไม่มีใครพูดถึงความจริงที่ว่าการดำเนินงานของคอลเล็กชั่น Guava อาจจะกระตือรือร้นหรือขี้เกียจ
billc.cn

คำตอบ:


3

ความเกียจคร้านใน Java 8 Streams ทำงานเหมือนกับที่เคยใช้กับ Iterables ใน Guava: คุณต้องส่งต่อ Iterable เพื่อให้ขี้เกียจและการประเมินเกิดขึ้นเมื่อคุณสร้าง Collection จาก Iterator ทั้งสตรีมและไอเทอเรเตอร์สามารถใช้ได้เพียงครั้งเดียวเท่านั้น

ดังนั้นสำหรับวิธีการเชื่อมต่อของคุณวิธีทั่วไป (อนุญาตความขี้เกียจ) คือการใช้ส่วนต่อประสานกระแส (เมื่อใดก็ตามที่คุณเคยใช้ Iterable มาก่อน) ดังที่ @Philipp กล่าวว่าสิ่งนี้ช่วยให้สามารถใช้ในท่อส่งกระแสข้อมูลได้

หวังว่าตั้งแต่ Stream ตอนนี้เป็นอินเตอร์เฟสมาตรฐาน Java อย่างเป็นทางการจะมีไลบรารีและฟังก์ชั่นอื่น ๆ เพิ่มขึ้นเรื่อย ๆ ซึ่งสามารถทำงานบน Streams ได้อย่างมีประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.