ครั้งแรกที่พวกเขาทั้งหมดที่ไม่เข้มงวด ที่มีความหมายทางคณิตศาสตร์เฉพาะที่เกี่ยวข้องกับฟังก์ชั่น แต่โดยทั่วไปหมายถึงพวกเขาจะคำนวณตามความต้องการแทนล่วงหน้า
Stream
เป็นรายการที่ขี้เกียจแน่นอน ในความเป็นจริงในสกาล่าที่Stream
เป็นList
ซึ่งเป็นtail
lazy val
เมื่อคำนวณแล้วค่าจะยังคงคำนวณและนำมาใช้ใหม่ หรืออย่างที่คุณพูดค่าต่างๆนั้นจะถูกแคชไว้
Iterator
สามารถใช้ได้เพียงครั้งเดียวเพราะมันเป็นตัวชี้ข้าม เข้าไปในคอลเลกชันและไม่คอลเลกชันในตัวเอง สิ่งที่ทำให้พิเศษใน Scala คือความจริงที่ว่าคุณสามารถใช้การแปลงเช่นmap
และfilter
และเพิ่งได้รับใหม่Iterator
ซึ่งจะใช้การแปลงเหล่านี้เมื่อคุณขอองค์ประกอบถัดไป
Scala เคยจัดเตรียมตัววนซ้ำซึ่งสามารถรีเซ็ตได้ แต่มันยากมากที่จะสนับสนุนในลักษณะทั่วไปและพวกเขาไม่ได้ทำรุ่น 2.8.0
มุมมองมีไว้เพื่อให้ดูเหมือนในมุมมองฐานข้อมูล มันเป็นชุดของการเปลี่ยนแปลงที่หนึ่งนำไปใช้กับคอลเลกชันในการผลิตคอลเลกชัน "เสมือน" ดังที่คุณกล่าวการแปลงทั้งหมดจะถูกนำมาใช้ใหม่ทุกครั้งที่คุณต้องการดึงองค์ประกอบจากมัน
ทั้งสองIterator
และมุมมองมีลักษณะหน่วยความจำที่ยอดเยี่ยม Stream
เป็นสิ่งที่ดี แต่ใน Scala ประโยชน์หลักของมันคือการเขียนลำดับที่ไม่สิ้นสุด (โดยเฉพาะอย่างยิ่งลำดับที่กำหนดซ้ำ) หนึ่งสามารถหลีกเลี่ยงการเก็บStream
หน่วยความจำทั้งหมดในโดยการทำให้แน่ใจว่าคุณไม่ได้อ้างอิงถึงมันhead
(ตัวอย่างเช่นโดยใช้def
แทนval
การกำหนดStream
)
เนื่องจากบทลงโทษที่เกิดขึ้นจากการดูหนึ่งครั้งจึงควรforce
ใช้หลังจากการแปลงหรือเก็บไว้เป็นมุมมองหากคาดว่าจะมีองค์ประกอบเพียงไม่กี่ชิ้นเท่านั้นเมื่อเทียบกับขนาดทั้งหมดของมุมมอง