การเรียงลำดับด้วย java 8 สตรีมทำงานอย่างไรภายใต้ประทุน?


10

เมื่อฉันเรียกว่าStream.sort(..)มีอาร์เรย์ขององค์ประกอบใหม่ที่สร้างขึ้นและสตรีม iterates มากกว่าอาร์เรย์ที่เรียงใหม่ที่สร้างขึ้น?

กล่าวอีกนัยหนึ่งว่า Java 8 Stream ทำsortอะไรได้บ้าง?


ทำไมฉันถึงลงคะแนนด้วยคำถามนี้ ???
InformedA

2
คำถามของคุณสมเหตุสมผลและไม่สมควรได้รับการโหวต ความคิดเห็นของคุณเกี่ยวกับคำตอบของอมร ... อย่างไรก็ตาม ...
Andres F.

@AndresF โหวตลงมาก่อนที่ฉันจะแสดงความคิดเห็นว่า นี่เป็นหนึ่งในเหตุผลที่ทำให้ฉันอารมณ์เสียมาก
InformedA

ความคิดเห็นไม่มีเหตุผลที่จะลงคะแนนอย่างไรก็ตาม คำถามนี้ตั้งอยู่บนข้อดีของตัวเองและมันก็ใช้ได้ในความคิดของฉัน ฉันยกมันขึ้นมา
Andres F.

คำตอบ:


10

คุณสามารถใช้grepcode.comเพื่อค้นหารหัสห้องสมุดมาตรฐาน Java (และห้องสมุดอื่น ๆ ) น่าเสียดายที่โค้ดการสร้างสตรีมค่อนข้างเป็นนามธรรม จุดเริ่มต้นที่ดีคือjava.util.stream.SortedOpsคลาสภายในซึ่งแปลงสตรีมเป็นสตรีมที่เรียงลำดับ

การดำเนินงานในปัจจุบัน (ใช้สำหรับการสตรีมของภาชนะบรรจุมาตรฐานห้องสมุด) ทำให้ไม่มี-op ถ้ากระแสเรียงแล้วใช้อาร์เรย์ถ้าขนาดของกระแสเป็นที่รู้จักกัน ( SizedRefSortingSink) หรือสะสมองค์ประกอบทั้งหมดใน ArrayList ถ้าขนาดคือ ไม่ทราบ ( RefSortingSink)

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

ลำธารอื่น ๆ จะต้องจัดให้มีการดำเนินการของตัวเองStream.sorted()ซึ่งอาจจะคล้ายกัน


1
@InformedA ฉันไม่ต้องการที่จะแนะนำว่า lambdas หรือลำธารจะเป็น "พล่ามภายใต้ประทุน" ทั้งสองมีความสะดวกสบายอย่างไม่น่าเชื่อถึงแม้ว่ารายละเอียดเกี่ยวกับกระแสจะซับซ้อนผิดปกติเมื่อเทียบกับแนวคิด Java อื่น ๆ หากคุณต้องการที่จะยึดติดกับแนวคิดที่คิดมาก่อนว่าเครื่องมือเหล่านี้ไร้ประโยชน์หรือเป็นอันตรายคุณกำลัง จำกัด ตัวเองโดยไม่จำเป็น
อมร

1
@amon - เห็นด้วยรวมทั้งกระแสให้ความเป็นไปได้ของการใช้งานแบบขนานมัลติคอร์ภายใต้ประทุนโดยไม่ต้องเปลี่ยนแอปพลิเคชัน และความซับซ้อนของการใช้กระแสนั้นมาจากนั้น นั่นเป็นมากกว่าแค่ความสะดวกสบายนั่นคือสิ่งที่เป็นนามธรรม สำหรับ OP - ฉันขอแนะนำให้คุณอ่านMastering Lambdas ...หากคุณต้องการเข้าใจว่าทำไม lambdas และลำธารจึงมีคุณสมบัติที่สะดวกกว่า
Yuri Steinschreiber

3
@InformedA: lambdas มีมานานกว่า 80 ปีแล้วและมีอยู่ในภาษาโปรแกรมกระแสหลักเกือบทุกภาษา สตรีมมีมานานกว่า 40 ปีและมีอยู่ในกรอบการทำงานหลัก ๆ ทุกอย่าง พวกเขาอาจถูกเรียกว่าสิ่งต่าง ๆ (ตัววนซ้ำรายการขี้เกียจตัวแจงนับจำนวน) แต่พวกมันอยู่ที่นั่น รายการแลมบ์ดาและสันหลังยาวเป็นบางส่วนของ abstractions ที่เก่าแก่ที่สุดและมีเสถียรภาพที่สุดและพวกเขาก็รอดชีวิตมาได้ในทุกรูปแบบใหม่, hype, กระบวนทัศน์, การเคลื่อนไหว, วิธีการ, เทคโนโลยี, ภาษา, ระบบปฏิบัติการ, กรอบ, ห้องสมุด นั่นทำให้พวกเขามีค่าดู
Jörg W Mittag

2
@InformedA Java ซึ่งเป็นภาษาการเขียนโปรแกรมเป็นเพียงนามธรรมที่ไร้สาระของ bytecode ทำงานบน JVM JVM นั้นเป็นเพียงนามธรรมที่เขียนใน C (หรือ C ++ ฉันลืม) C และ C ++ เป็นเพียงนามธรรมที่น่ารังเกียจมากกว่าภาษาแอสเซมบลี แม้ภาษาประกอบตัวเองเป็นนามธรรมพล่ามกว่าเฟิร์มแวซึ่งเป็นยังนามธรรมพล่ามมากกว่าวงจร (ตกลงฉันอาจจะหายไปไม่กี่ขั้นตอนในระหว่าง) คุณสามารถพูดได้ว่าทุกสิ่งที่มีประโยชน์ในซอฟต์แวร์คือ "สิ่งที่เป็นนามธรรม" เหนือสิ่งอื่นใด
Andres F.

3
@InformedA คำแนะนำที่ซื่อสัตย์ของฉันคือให้คุณลองเรียนรู้ภาษาที่เน้นการเขียนโปรแกรมเพื่อการทำงานมากกว่า Java แม้ว่าคุณจะไม่เคยใช้มันสำหรับงานประจำวันของคุณคุณจะได้รับความเข้าใจในภาษาการเขียนโปรแกรมและตัวเลือกการออกแบบที่จะช่วยคุณในการใช้ภาษาจาวา :)
Andres F.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.