ฉันจะขยายความคิดเห็นของฉันเล็กน้อย List[T]
โครงสร้างข้อมูลจากscala.collection.immutable
การเพิ่มประสิทธิภาพในการทำงานทางรายการไม่เปลี่ยนรูปในการทำงานมากขึ้นอย่างหมดจดผลงานการเขียนโปรแกรมภาษา มันมีอย่างรวดเร็วย่อหน้าครั้งและมันจะสันนิษฐานว่าคุณจะทำงานบนหัวเกือบทั้งหมดของการเข้าถึงของคุณ
รายการที่ไม่เปลี่ยนรูปจะมีเวลาเตรียมการที่รวดเร็วมากเนื่องจากพวกเขาจำลองรายการที่เชื่อมโยงเป็นชุดของ "cons cells" เซลล์กำหนดค่าเดียวและตัวชี้ไปยังเซลล์ถัดไป (สไตล์รายการแบบเชื่อมโยงโดยลำพังคลาสสิก):
Cell [Value| -> Nil]
เมื่อคุณเพิ่มเข้าไปในรายการคุณจะสร้างเซลล์ใหม่เพียงเซลล์เดียวโดยส่วนที่เหลือของรายการที่มีอยู่จะชี้ไปที่:
Cell [NewValue| -> [Cell[Value| -> Nil]]
เพราะรายการจะไม่เปลี่ยนรูปคุณปลอดภัยในการทำเช่นนี้โดยการคัดลอกใด ๆ ที่เกิดขึ้นจริง ไม่มีอันตรายจากการเปลี่ยนแปลงรายการเก่าและทำให้ค่าทั้งหมดในรายการใหม่ของคุณไม่ถูกต้อง อย่างไรก็ตามคุณสูญเสียความสามารถในการที่จะมีตัวชี้ที่เปลี่ยนแปลงไม่ได้ไปอยู่ท้ายรายการของคุณ
สิ่งนี้ให้ยืมตัวเองดีมากในการทำงานซ้ำในรายการ สมมติว่าคุณกำหนดเวอร์ชันของคุณเองfilter
:
def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
case Nil => Nil
case (x::xs) => f(x) match {
case true => deleteIf(xs)(f)
case false => x :: deleteIf(xs)(f)
}
}
เป็นฟังก์ชันแบบเรียกซ้ำที่ทำงานจากส่วนหัวของรายการโดยเฉพาะและใช้ประโยชน์จากการจับคู่รูปแบบผ่านทาง :: ตัวแยก นี่คือสิ่งที่คุณเห็นในภาษาจำนวนมากเช่น Haskell
หากคุณต้องการผนวกอย่างรวดเร็วจริง ๆ Scala มีโครงสร้างข้อมูลที่ไม่แน่นอนและไม่เปลี่ยนรูปแบบให้เลือกมากมาย ListBuffer
ในด้านที่ไม่แน่นอนคุณอาจมองเข้าไปใน อีกทางเลือกหนึ่งVector
จากscala.collection.immutable
มีเวลาผนวกที่รวดเร็ว