การกรองด้วย if
การ์ดใน comprehension
การกรองด้วย if เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
เงื่อนไขกรองใน for-comprehension
ภายใน for-comprehension คุณสามารถเพิ่มเงื่อนไข if ที่เรียกว่า guard ได้ เงื่อนไขนี้จะเก็บไว้เฉพาะสมาชิกที่ตรงตามเงื่อนไข เช่นเดียวกับ filter
object Main {
def main(args: Array[String]): Unit = {
val evens = for (x <- 1 to 10 if x % 2 == 0) yield x
println(evens)
}
}Guard ถูกแปลงเป็น withFilter
Guard if cond จะถูกแปลงเป็นการเรียก withFilter ซึ่งเป็นรูปแบบขี้เกียจของ filter
for (x <- xs if p(x)) yield x- จะกลายเป็น
xs.withFilter(p).map(x => x)
object Main {
def main(args: Array[String]): Unit = {
val sugar = for (x <- List(1, 2, 3, 4) if x > 2) yield x
val desugared = List(1, 2, 3, 4).withFilter(_ > 2).map(x => x)
println(sugar == desugared)
}
}ทำไมจึงใช้ withFilter แทน filter
withFilter ทำงานแบบขี้เกียจ โดยไม่สร้างคอลเลกชันระหว่างทาง เงื่อนไขจะถูกนำไปใช้เมื่อ map หรือ flatMap ถัดไปเริ่มทำงานเท่านั้น จึงช่วยประหยัดหน่วยความจำและการประมวลผล
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5, 6)
val result = for (n <- nums if n % 3 == 0) yield n * 100
println(result)
}
}Guard หลายรายการ
คุณสามารถเชื่อม Guard หลายรายการต่อกันได้ โดยจะทำงานเหมือน AND ทางตรรกะ กล่าวคือ สมาชิกจะต้องผ่านทุกเงื่อนไขจึงจะเหลืออยู่
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 20
if x % 2 == 0
if x % 3 == 0
} yield x
println(result)
}
}Guard กับตัวสร้างหลายตัว
สามารถวาง Guard ไว้หลังตัวสร้างใดก็ได้ และใช้กรองระดับการวนซ้ำนั้น ให้วาง Guard ต่อจากตัวสร้างที่ให้ค่าซึ่ง Guard นั้นใช้ตรวจสอบ
object Main {
def main(args: Array[String]): Unit = {
val coprimeSums = for {
x <- 1 to 3
y <- 1 to 3
if x != y
} yield (x, y)
println(coprimeSums)
}
}การรวม Guard กับการผูกค่า
คุณสามารถใช้ Guard (if) ร่วมกับการผูกค่า (=) ได้อย่างอิสระ ลำดับมีความสำคัญ: การผูกค่าที่กำหนดไว้ก่อน Guard สามารถนำไปใช้ภายใน Guard นั้นได้
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 6
square = x * x
if square > 10
} yield square
println(result)
}
}Guard กับคอลเลกชัน String
Guard ใช้ได้กับเพรดิเคตทุกชนิด ไม่จำกัดเฉพาะตัวเลข ในที่นี้ เรากรองคำตามความยาว
object Main {
def main(args: Array[String]): Unit = {
val words = List("scala", "go", "java", "rust", "c")
val longWords = for (w <- words if w.length >= 4) yield w.toUpperCase
println(longWords)
}
}การกรองออปชัน
สำหรับ Option Guard ที่ไม่ผ่านจะเปลี่ยนผลลัพธ์เป็น None ทำให้ for-comprehension เป็นวิธีที่อ่านง่ายในการตรวจสอบค่าที่อาจไม่มี
object Main {
def main(args: Array[String]): Unit = {
val ok = for (x <- Some(8) if x > 5) yield x
val bad = for (x <- Some(3) if x > 5) yield x
println(ok)
println(bad)
}
}ตำแหน่งของ Guard เปลี่ยนความหมาย
การ์ดจะมองเห็นเฉพาะค่าที่ถูกผูกไว้ ก่อนหน้า เท่านั้น หากวางการ์ดไว้ก่อนตัวสร้างที่การ์ดต้องใช้ โค้ดจะคอมไพล์ไม่ผ่าน ควรวางการ์ดไว้หลังตัวสร้างที่เกี่ยวข้องเสมอ
object Main {
def main(args: Array[String]): Unit = {
val result = for {
x <- 1 to 3
y <- 1 to 3
if x + y == 4
} yield s"$x + $y = ${x + y}"
result.foreach(println)
}
}การ์ดเทียบกับตัวกรองสุดท้าย
คุณสามารถกรองผลลัพธ์หลังจบการทำความเข้าใจได้ แต่การ์ดจะกรอง ระหว่าง การวนซ้ำ เมื่อมีตัวสร้างหลายตัว การ์ดจะตัดแขนงที่ไม่จำเป็นออกได้ตั้งแต่เนิ่น ๆ ทำให้ทำงานโดยรวมน้อยลง
object Main {
def main(args: Array[String]): Unit = {
val withGuard = for {
x <- 1 to 100
if x % 25 == 0
} yield x
println(withGuard)
}
}กระบวนการตรวจสอบที่อ่านเข้าใจง่าย
การวางการ์ดต่อกันทำให้โค้ดอ่านเหมือนรายการตรวจสอบเงื่อนไข นี่เป็นหนึ่งในการใช้งาน for-comprehension ที่เป็นสำนวนตามธรรมชาติมากที่สุดในโค้ด Scala จริง
object Main {
def main(args: Array[String]): Unit = {
val valid = for {
n <- List(4, 7, 12, 15, 20)
if n > 5
if n < 18
if n % 2 == 0
} yield n
println(valid)
}
}ตรวจสอบอย่างรวดเร็ว
การ์ด (if) ใน for-comprehension ถูกแปลงรูปเป็นเมธอดใด
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับการ์ดใน for-comprehension:
if condกรององค์ประกอบระหว่างการวนซ้ำ- การ์ดถูกแปลงรูปเป็น
withFilter(การกรองแบบประเมินเมื่อจำเป็น) - การ์ดหลายตัวทำงานร่วมกันเหมือน AND เชิงตรรกะ
- การ์ดจะมองเห็นเฉพาะค่าที่ถูกผูกไว้ก่อนหน้าเท่านั้น
- การ์ดสามารถใช้ร่วมกับตัวสร้างและการผูกค่าด้วย
=ได้อย่างอิสระ
คำถามที่พบบ่อย
บทเรียน “การกรองด้วย if” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกรองด้วย if” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกรองด้วย if”
การ์ดใน comprehension คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การกรองด้วย if” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ