0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

การกรองด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคลี่รูป for
  2. การกรองด้วย if
  3. ตัวสร้างหลายตัว
  4. การใช้ร่วมกับ Option และ Future
← กลับไปที่ Scala for Backend Engineering & Functional Programming