ฟังก์ชันในฐานะค่า
ฟังก์ชันชั้นหนึ่ง
ฟังก์ชันในฐานะค่า เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันคือค่า
ใน Scala ฟังก์ชันเป็นค่าชั้นหนึ่ง คุณสามารถเก็บฟังก์ชันไว้ในตัวแปร ส่งเป็นอาร์กิวเมนต์ และคืนค่าจากฟังก์ชันอื่นได้ เช่นเดียวกับตัวเลขหรือข้อความ
object Main {
def main(args: Array[String]): Unit = {
val increment: Int => Int = x => x + 1
println(increment(5))
}
}ไวยากรณ์ชนิดฟังก์ชัน
ชนิด Int => String หมายถึงฟังก์ชันที่รับ Int และคืนค่าเป็น String หากมีพารามิเตอร์หลายตัว ให้ใช้วงเล็บ: (Int, Int) => Int
object Main {
def main(args: Array[String]): Unit = {
val add: (Int, Int) => Int = (a, b) => a + b
val label: Int => String = n => s"value=$n"
println(add(3, 4))
println(label(7))
}
}ไวยากรณ์แลมบ์ดา (ฟังก์ชันไม่ระบุชื่อ)
ฟังก์ชันไม่ระบุชื่อ หรือแลมบ์ดา เขียนเป็น (params) => body ฟังก์ชันนี้ไม่มีชื่อ และมักส่งให้ฟังก์ชันอื่นโดยตรง
object Main {
def main(args: Array[String]): Unit = {
val square = (x: Int) => x * x
println(square(6))
}
}ฟังก์ชันลำดับสูง
ฟังก์ชันลำดับสูงคือฟังก์ชันที่รับฟังก์ชันเป็นพารามิเตอร์ หรือคืนค่าฟังก์ชัน ตัวอย่างคลาสสิกคือ map และ filter
object Main {
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def main(args: Array[String]): Unit = {
println(applyTwice(_ + 3, 10))
}
}การส่งฟังก์ชันให้เมธอด
เมธอดของคอลเลกชันรับฟังก์ชันได้ คุณสามารถส่งแลมบ์ดาแบบเขียนในบรรทัดนั้น หรือส่งค่าฟังก์ชันที่มีชื่อแล้วก็ได้
object Main {
def main(args: Array[String]): Unit = {
val triple = (x: Int) => x * 3
println(List(1, 2, 3).map(triple))
println(List(1, 2, 3).map(x => x * 3))
}
}การคืนค่าฟังก์ชัน
ฟังก์ชันสามารถคืนค่าฟังก์ชันอื่นได้ ในที่นี้ multiplier คืนค่าฟังก์ชันที่คูณด้วยตัวคูณคงที่ ซึ่งเป็นโรงงานฟังก์ชันขนาดเล็ก
object Main {
def multiplier(factor: Int): Int => Int = x => x * factor
def main(args: Array[String]): Unit = {
val timesTen = multiplier(10)
println(timesTen(5))
}
}เมธอดเทียบกับฟังก์ชัน
def ใช้กำหนดเมธอด คุณสามารถเปลี่ยนเมธอดให้เป็นค่าฟังก์ชันด้วยขีดล่างสำหรับการขยายแบบเอทา: methodName _ หรือเพียงใช้เมธอดในตำแหน่งที่ต้องการฟังก์ชัน
object Main {
def doubleIt(x: Int): Int = x * 2
def main(args: Array[String]): Unit = {
val f: Int => Int = doubleIt
println(f(8))
println(List(1, 2, 3).map(doubleIt))
}
}ฟังก์ชันที่ไม่มีพารามิเตอร์
ฟังก์ชันสามารถไม่รับอาร์กิวเมนต์ได้ ชนิดของฟังก์ชันเขียนเป็น () => T ซึ่งมีประโยชน์สำหรับเลื่อนเวลาการคำนวณออกไป
object Main {
def main(args: Array[String]): Unit = {
val greeting: () => String = () => "Hello!"
println(greeting())
}
}การเก็บฟังก์ชันในคอลเลกชัน
เนื่องจากฟังก์ชันเป็นค่า คุณจึงเก็บฟังก์ชันไว้ในรายการหรือแมป แล้วค้นหาแบบไดนามิกได้ ทำให้สร้างตัวกระจายคำสั่งขนาดเล็กได้
object Main {
def main(args: Array[String]): Unit = {
val ops: Map[String, (Int, Int) => Int] = Map(
"add" -> (_ + _),
"mul" -> (_ * _)
)
println(ops("add")(3, 4))
println(ops("mul")(3, 4))
}
}ฟังก์ชันในฐานะการกำหนดค่า
การส่งฟังก์ชันช่วยให้ผู้เรียกกำหนดพฤติกรรมเองได้ ในที่นี้ transformAll แบบทั่วไปจะใช้ฟังก์ชันใดก็ได้กับสมาชิกทุกตัวในรายการ
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), _ + 100))
println(transformAll(List(1, 2, 3), _ * 10))
}
}ตัวอย่างการปรับแต่งที่อ่านง่ายขึ้น
นี่คือตัวอย่างแนวคิดเดียวกันที่เขียนให้สะอาดขึ้น โดยผู้เรียกเป็นผู้จัดเตรียมการแปลง ทำให้ตัวช่วยยังคงเป็นแบบทั่วไปและนำกลับมาใช้ใหม่ได้
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), x => x + 100))
println(transformAll(List(1, 2, 3), x => x * x))
}
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ฟังก์ชันลำดับสูงคืออะไร
สรุปทบทวน
คุณได้เรียนรู้ว่าฟังก์ชันเป็นค่าชั้นหนึ่ง:
- เก็บฟังก์ชันไว้ใน
valรายการ และแมป - ชนิดฟังก์ชัน เช่น
Int => String - แลมบ์ดา:
(x) => bodyและรูปแบบย่อด้วย_ - ฟังก์ชันลำดับสูงรับหรือคืนค่าฟังก์ชัน
- เมธอดกลายเป็นค่าฟังก์ชันผ่านการขยายแบบเอทา
คำถามที่พบบ่อย
บทเรียน “ฟังก์ชันในฐานะค่า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ฟังก์ชันในฐานะค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ฟังก์ชันในฐานะค่า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชันในฐานะค่า
- การทำเคอร์รี
- การประกอบฟังก์ชัน
- โคลเชอร์