ฉันเคยเห็นในตัวอย่างมากมายที่บางครั้งใช้ Seq ในขณะที่เวลาอื่นคือรายการ ...
มีความแตกต่างนอกเหนือจากที่เคยเป็นประเภทสกาล่าและรายชื่อมาจาก Java หรือไม่?
ฉันเคยเห็นในตัวอย่างมากมายที่บางครั้งใช้ Seq ในขณะที่เวลาอื่นคือรายการ ...
มีความแตกต่างนอกเหนือจากที่เคยเป็นประเภทสกาล่าและรายชื่อมาจาก Java หรือไม่?
คำตอบ:
ในแง่ Java, Scala ของSeq
จะเป็นของ Java List
และสกาล่าของList
จะเป็นของ LinkedList
Java
โปรดทราบว่าSeq
นี่คือ a trait
ซึ่งเทียบเท่ากับ Java interface
แต่เทียบเท่ากับวิธีการป้องกันแบบใหม่ล่าสุด กาลาฯList
เป็นระดับนามธรรมที่ขยายNil
และซึ่งมีการใช้งานที่เป็นรูปธรรมของ::
List
ดังนั้นที่ของ Java List
คือการinterface
Scala ของList
เป็นการดำเนินการ
นอกเหนือจากนั้น Scala ของจะไม่เปลี่ยนรูปซึ่งไม่ได้เป็นกรณีของList
LinkedList
ในความเป็นจริง Java ไม่เทียบเท่ากับคอลเลกชันที่ไม่เปลี่ยนรูปแบบ (สิ่งที่อ่านอย่างเดียวรับประกันได้ว่าวัตถุใหม่ไม่สามารถเปลี่ยนได้ แต่คุณยังสามารถเปลี่ยนอันเก่าได้ดังนั้นจึงเป็น "แบบอ่านอย่างเดียว")
Scala's List
นั้นได้รับการปรับให้เหมาะสมอย่างมากโดยคอมไพเลอร์และไลบรารีและเป็นประเภทข้อมูลพื้นฐานในการเขียนโปรแกรมการทำงาน อย่างไรก็ตามมีข้อ จำกัด และไม่เพียงพอสำหรับการเขียนโปรแกรมแบบขนาน ทุกวันนี้Vector
เป็นตัวเลือกที่ดีกว่าList
แต่นิสัยก็ยากที่จะทำลาย
Seq
เป็นลักษณะทั่วไปที่ดีสำหรับลำดับดังนั้นหากคุณตั้งโปรแกรมอินเตอร์เฟซคุณควรใช้มัน โปรดทราบว่ามีอยู่สามประการด้วยกัน: collection.Seq
, collection.mutable.Seq
และcollection.immutable.Seq
, และเป็นอันหลังที่เป็น "ค่าเริ่มต้น" ที่นำเข้าสู่ขอบเขต
นอกจากนี้ยังมีและGenSeq
ParSeq
เมธอดหลังจะทำงานแบบขนานหากเป็นไปได้ในขณะที่วิธีแรกคือพาเรนต์ของทั้งคู่Seq
และParSeq
เป็นวิธีการทั่วไปที่เหมาะสมสำหรับเมื่อการขนานของโค้ดไม่สำคัญ พวกเขาทั้งคู่เพิ่งถูกนำมาใช้ใหม่ดังนั้นผู้คนจึงยังไม่ค่อยได้ใช้เท่าไหร่
UnsupportedOperationException
เหตุนี้ เพื่อสร้างรายการที่ไม่เปลี่ยนรูปแบบใน Java คุณใช้ Collections.unmodifiableList () และในทำนองเดียวกันมีวิธีการอื่น ๆ สำหรับชุด Maps แผนที่ ฯลฯdocs.oracle.com/javase/6/docs/api/java/util/ …
ลำดับเป็น Iterable ที่มีคำสั่งที่กำหนดไว้ขององค์ประกอบ ลำดับให้วิธีการapply()
สำหรับการจัดทำดัชนีตั้งแต่ 0 ถึงความยาวของลำดับ Seq มีคลาสย่อยมากมายรวมถึง Queue, Range, List, Stack และ LinkedList
รายการเป็นลำดับที่จะดำเนินการในฐานะที่เป็นรายการที่เชื่อมโยงไม่เปลี่ยนรูป มันใช้ดีที่สุดในกรณีที่มีรูปแบบการเข้าถึงเข้าก่อนออกก่อน (LIFO)
นี่คือลำดับชั้นคลาสการรวบรวมที่สมบูรณ์จากคำถามที่พบบ่อย Scala :
Seq
เป็นลักษณะที่List
ใช้
หากคุณกำหนดภาชนะของคุณเป็นSeq
คุณสามารถใช้ภาชนะใด ๆ ที่ดำเนินการSeq
ลักษณะ
scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int
scala> sumUp(List(1,2,3))
res41: Int = 6
scala> sumUp(Vector(1,2,3))
res42: Int = 6
scala> sumUp(Seq(1,2,3))
res44: Int = 6
สังเกตได้ว่า
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
เป็นเพียงมือสั้น ๆ สำหรับ:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
List
หากประเภทภาชนะที่ไม่ได้ระบุค่าเริ่มต้นพื้นฐานโครงสร้างข้อมูลไปยัง
ในกาลาที่สืบทอดรายการจากลำดับ แต่การดำเนินการสินค้า ; นี่คือความหมายที่เหมาะสมของรายการ :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[หมายเหตุ: จริงนิยาม . เป็นผู้ตาดบิตซับซ้อนมากขึ้นในการสั่งซื้อเพื่อให้สอดคล้องกับและใช้ประโยชน์จากกรอบคอลเลกชันของสกาล่าที่มีประสิทธิภาพมาก]
ดังที่ @ daniel-c-sobral กล่าวว่ารายการจะขยายลักษณะของ Seq และเป็นระดับนามธรรมที่ดำเนินการโดยscala.collection.immutable.$colon$colon
(หรือ::
สั้น ๆ ) แต่ด้านเทคนิคยังคำนึงถึงว่ารายการและ seqs ส่วนใหญ่ที่เราใช้นั้นจะเริ่มต้นในรูปแบบของSeq(1, 2, 3)
หรือList(1, 2, 3)
ที่ทั้งสองคืนscala.collection.immutable.$colon$colon
ดังนั้นหนึ่งสามารถเขียน:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
เป็นผลให้ฉันเถียงมากกว่าสิ่งเดียวที่สำคัญคือวิธีการที่คุณต้องการเปิดเผยเช่นคุณสามารถใช้ prepend ::
จากรายการที่ฉันพบซ้ำซ้อนกับ+:
จาก Seq และโดยส่วนตัวฉันติด Seq โดยค่าเริ่มต้น
String
จะไม่ใช่คอลเล็กชัน แต่เป็นตัวอย่างของคลาสที่ไม่เปลี่ยนรูปซึ่งคุ้นเคยกับโปรแกรมเมอร์ Java