ตัวสร้างหลายตัว
การวนซ้ำแบบซ้อน
ตัวสร้างหลายตัว เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
การวนซ้ำซ้อนกันทำให้แบนราบ
for-comprehension สามารถมี ตัวสร้าง ได้หลายตัว แต่ละตัวคือบรรทัด <- ที่วนซ้ำผ่านคอลเลกชัน เมื่อนำมารวมกัน ตัวสร้างเหล่านี้จะสร้างชุดผสมที่เป็นไปได้ทุกแบบ ซึ่งคล้ายลูปซ้อนกันที่เขียนให้อยู่ในรูปแบบแบนราบ
object Main {
def main(args: Array[String]): Unit = {
val pairs = for {
x <- List(1, 2)
y <- List('a', 'b')
} yield (x, y)
println(pairs)
}
}นี่คือผลคูณคาร์ทีเซียน
ตัวสร้างสองตัวที่มีขนาด m และ n จะสร้างผลลัพธ์ m × n รายการ ซึ่งเป็น ผลคูณคาร์ทีเซียน ทั้งหมด ตัวสร้างแรกคือลูปภายนอก และตัวสร้างที่สองคือลูปภายใน
object Main {
def main(args: Array[String]): Unit = {
val grid = for {
row <- 1 to 3
col <- 1 to 3
} yield s"r$row-c$col"
println(grid.mkString(", "))
}
}ตัวสร้างภายในสามารถขึ้นอยู่กับตัวสร้างภายนอก
ตัวสร้างที่อยู่ถัดมาสามารถใช้ค่าที่ถูกผูกไว้โดยตัวสร้างก่อนหน้าได้ สิ่งนี้ทำไม่ได้ด้วยผลคูณคาร์ทีเซียนธรรมดา และเป็นเหตุผลหนึ่งที่ทำให้ for-comprehension ยืดหยุ่นมาก
object Main {
def main(args: Array[String]): Unit = {
val upperTriangle = for {
i <- 1 to 4
j <- i to 4
} yield (i, j)
println(upperTriangle)
}
}ตัวสร้างสามตัวขึ้นไป
คุณสามารถวางตัวสร้างต่อกันได้มากเท่าที่ต้องการ ตัวสร้างสามตัวจะให้ลูปซ้อนกันสามชั้น ซึ่งสร้างทูเพิลหรือค่าที่คำนวณแล้ว
object Main {
def main(args: Array[String]): Unit = {
val triples = for {
a <- 1 to 2
b <- 1 to 2
c <- 1 to 2
} yield (a, b, c)
println(triples.size + " combinations")
triples.foreach(println)
}
}ตัวอย่างพีทาโกรัสคลาสสิก
การใช้งานที่มีชื่อเสียงอย่างหนึ่งคือการค้นหาจำนวนสามพีทาโกรัส เราจะวนผ่านตัวเลขสามจำนวนและเก็บไว้เฉพาะชุดที่ a*a + b*b == c*c โดยใช้ตัวสร้างหลายตัวร่วมกับการ์ด
object Main {
def main(args: Array[String]): Unit = {
val triples = for {
a <- 1 to 20
b <- a to 20
c <- b to 20
if a * a + b * b == c * c
} yield (a, b, c)
triples.foreach(println)
}
}การแปลงรูป
ตัวสร้างหลายตัวจะกลายเป็นการเรียก flatMap ซ้อนกัน โดยมี map อยู่ท้ายสุด:
xs.flatMap(x => ys.flatMap(y => zs.map(z => ...)))
ตัวสร้างเพิ่มเติมแต่ละตัวจะเพิ่มระดับการซ้อนอีกหนึ่งระดับ
object Main {
def main(args: Array[String]): Unit = {
val sugar = for {
x <- List(1, 2)
y <- List(3, 4)
} yield x * y
val desugared = List(1, 2).flatMap(x => List(3, 4).map(y => x * y))
println(sugar == desugared)
}
}การผสมตัวสร้างกับการ์ด
คุณสามารถสลับใช้ตัวสร้างและการ์ดได้อย่างอิสระ การ์ดที่วางอยู่ระหว่างตัวสร้างสองตัวจะตัดค่าจากภายนอกออกก่อนที่ลูปภายในจะเริ่มทำงาน
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 5
if x % 2 == 1
y <- 1 to 5
if y > x
} yield (x, y)
println(result)
}
}ทำคอลเลกชันซ้อนกันให้แบนราบ
เมื่อคุณมีคอลเลกชันที่ประกอบด้วยคอลเลกชันอีกที ตัวสร้างสองตัวจะทำให้คอลเลกชันนั้นแบนราบได้อย่างเป็นธรรมชาติ ตัวแรกวนผ่านคอลเลกชันภายนอก ส่วนตัวที่สองวนผ่านคอลเลกชันภายในแต่ละรายการ
object Main {
def main(args: Array[String]): Unit = {
val matrix = List(List(1, 2), List(3, 4), List(5, 6))
val flat = for {
row <- matrix
value <- row
} yield value
println(flat)
}
}การสร้างตารางสตริง
ตัวสร้างหลายตัวเหมาะอย่างยิ่งสำหรับการสร้างผลลัพธ์ที่มีโครงสร้าง เช่น พิกัดหรือตารางสูตรคูณ
object Main {
def main(args: Array[String]): Unit = {
val table = for {
i <- 1 to 3
j <- 1 to 3
} yield s"$i*$j=${i * j}"
println(table.grouped(3).map(_.mkString(" ")).mkString("\n"))
}
}การรวมคอลเลกชันที่มีขนาดต่างกัน
ตัวสร้างไม่จำเป็นต้องมีความยาวเท่ากัน ระบบจะสร้างชุดผสมจากองค์ประกอบหนึ่งตัวของแต่ละคอลเลกชัน
object Main {
def main(args: Array[String]): Unit = {
val sizes = List("S", "M", "L")
val colors = List("red", "blue")
val products = for {
s <- sizes
c <- colors
} yield s"$c-$s"
println(products)
}
}ลำดับมีผลต่อลำดับผลลัพธ์
การสลับลำดับตัวสร้างจะยังคงได้ชุดผสมเดิม แต่เปลี่ยนลำดับของผลลัพธ์ เพราะตัวสร้างสุดท้ายจะเปลี่ยนค่าเร็วที่สุด
object Main {
def main(args: Array[String]): Unit = {
val ab = for { x <- List(1, 2); y <- List(9, 8) } yield (x, y)
val ba = for { y <- List(9, 8); x <- List(1, 2) } yield (x, y)
println(ab)
println(ba)
}
}ตรวจสอบอย่างรวดเร็ว
for { x <- List(1,2,3); y <- List('a','b') } yield (x, y) สร้างทูเพิลกี่รายการ
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับตัวสร้างหลายตัว:
- แต่ละบรรทัด
<-จะเพิ่มระดับการวนซ้ำซ้อนกันหนึ่งระดับ - เมื่อนำมารวมกัน ตัวสร้างจะสร้างผลคูณคาร์ทีเซียน
- ตัวสร้างภายในสามารถขึ้นอยู่กับค่าที่ถูกผูกไว้จากภายนอก
- ตัวสร้างจะถูกแปลงรูปเป็น
flatMapซ้อนกันและตามด้วยmapสุดท้าย - ลำดับตัวสร้างจะเปลี่ยนลำดับของผลลัพธ์
คำถามที่พบบ่อย
บทเรียน “ตัวสร้างหลายตัว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวสร้างหลายตัว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวสร้างหลายตัว”
การวนซ้ำแบบซ้อน คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวสร้างหลายตัว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคลี่รูป for
- การกรองด้วย if
- ตัวสร้างหลายตัว
- การใช้ร่วมกับ Option และ Future