ฟังก์ชันขยายและฟังก์ชันลำดับสูง
เพิ่มพฤติกรรมให้ชนิดข้อมูลที่มีอยู่ด้วยฟังก์ชันขยาย และใช้ฟังก์ชันลำดับสูงกับฟังก์ชันขอบเขต (let, apply, also, run, with) เพื่อเขียนโค้ด Kotlin ที่สื่อความหมาย
ฟังก์ชันขยายและฟังก์ชันลำดับสูง เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันขยาย
ฟังก์ชันขยายช่วยให้คุณเพิ่มฟังก์ชันใหม่ให้กับคลาสที่มีอยู่ได้ โดยไม่ต้องแก้ไขคลาสเหล่านั้นหรือใช้การสืบทอด คุณสามารถขยาย String, Int, คลาสของคุณเอง หรือแม้แต่ View ของ Android ได้
ไวยากรณ์: fun TypeName.functionName() { }
การเขียนฟังก์ชันขยาย
ภายในฟังก์ชันขยาย this จะอ้างถึงออบเจ็กต์ผู้รับ:
fun String.isPalindrome(): Boolean {
val cleaned = this.lowercase().filter { it.isLetter() }
return cleaned == cleaned.reversed()
}
fun Int.isEven() = this % 2 == 0
fun main() {
println("racecar".isPalindrome()) // true
println("hello".isPalindrome()) // false
println(4.isEven()) // true
println(7.isEven()) // false
}ฟังก์ชันขยายสำหรับ View ของ Android
รูปแบบที่ใช้กันทั่วไปใน Android — ซ่อนหรือแสดง View ด้วยฟังก์ชันขยาย แทนการเขียนโค้ดส่วนเกินซ้ำ ๆ:
import android.view.View
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// Usage in Activity:
// binding.progressBar.show()
// binding.recyclerView.hide()ฟังก์ชันลำดับสูง
ฟังก์ชันลำดับสูงรับฟังก์ชันเป็นพารามิเตอร์หรือส่งคืนฟังก์ชัน คุณเคยใช้งานฟังก์ชันเหล่านี้แล้ว: filter, map และ forEach ล้วนเป็นฟังก์ชันลำดับสูง
ไวยากรณ์ประเภทฟังก์ชัน: (ParamType) -> ReturnType
การส่งฟังก์ชันเป็นพารามิเตอร์
กำหนดฟังก์ชันที่รับฟังก์ชันอื่น:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun main() {
val sum = operate(3, 4) { x, y -> x + y }
val prod = operate(3, 4) { x, y -> x * y }
val max = operate(3, 4, ::maxOf) // method reference
println(sum) // 7
println(prod) // 12
println(max) // 4
}การส่งคืนฟังก์ชัน
ฟังก์ชันสามารถส่งคืนฟังก์ชันอื่นได้เช่นกัน ซึ่งมีประโยชน์สำหรับสร้างพฤติกรรมที่กำหนดค่าได้:
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
fun main() {
val double = makeMultiplier(2)
val triple = makeMultiplier(3)
println(double(5)) // 10
println(triple(5)) // 15
val numbers = listOf(1, 2, 3, 4)
println(numbers.map(double)) // [2, 4, 6, 8]
}ฟังก์ชันขอบเขต: let
ฟังก์ชันขอบเขตของ Kotlin จะเรียกใช้บล็อกกับออบเจ็กต์และส่งคืนผลลัพธ์ let ใช้สำหรับตรวจสอบค่า null และแปลงข้อมูล:
fun main() {
val name: String? = "Alice"
// Only runs if name is not null
name?.let {
println("Name length: ${it.length}")
println("Upper: ${it.uppercase()}")
}
// Transform a value
val length = name?.let { it.length } ?: 0
println("Length: $length") // 5
}ฟังก์ชันขอบเขต: apply และ also
apply ใช้กำหนดค่าให้ออบเจ็กต์และส่งคืนออบเจ็กต์นั้น ส่วน also ใช้ดำเนินการข้างเคียงและส่งคืนออบเจ็กต์:
data class Config(var host: String = "", var port: Int = 0, var timeout: Int = 0)
fun main() {
// apply: configure an object (this = receiver)
val config = Config().apply {
host = "api.example.com"
port = 443
timeout = 30
}
println(config) // Config(host=api.example.com, port=443, timeout=30)
// also: log or debug (it = receiver)
val result = listOf(1, 2, 3)
.also { println("Original: $it") }
.map { it * 2 }
.also { println("Doubled: $it") }
}ฟังก์ชันขอบเขต: run และ with
run จะเรียกใช้บล็อกกับออบเจ็กต์และส่งคืนผลลัพธ์ของบล็อก ส่วน with มีลักษณะคล้ายกัน แต่ไม่ใช่ฟังก์ชันขยาย:
data class User(val name: String, val age: Int)
fun main() {
val user = User("Bob", 30)
// run: compute something using the object
val greeting = user.run {
if (age >= 18) "Hello, $name!" else "Hi, $name!"
}
println(greeting) // Hello, Bob!
// with: group operations on an object
val info = with(user) {
"Name: $name, Age: $age"
}
println(info) // Name: Bob, Age: 30
}สรุปฟังก์ชันขอบเขต
ข้อมูลอ้างอิงอย่างรวดเร็วสำหรับเลือกฟังก์ชันขอบเขตที่เหมาะสม:
let— บล็อกที่ปลอดภัยต่อค่า null, แปลงออบเจ็กต์ และส่งคืนผลลัพธ์ของแลมบ์ดาapply— กำหนดค่าให้ออบเจ็กต์ และส่งคืนออบเจ็กต์นั้น (this)also— ผลข้างเคียง (การบันทึกข้อมูล) และส่งคืนออบเจ็กต์นั้น (it)run— คำนวณผลลัพธ์จากออบเจ็กต์ และส่งคืนผลลัพธ์ของแลมบ์ดาwith— จัดกลุ่มการเรียกใช้กับออบเจ็กต์ และไม่ใช่ฟังก์ชันขยาย
ฟังก์ชัน inline และ reified
ทำเครื่องหมายฟังก์ชันลำดับสูงด้วย inline เพื่อหลีกเลี่ยงการจัดสรรออบเจ็กต์แลมบ์ดาขณะรันไทม์ ส่วน reified ช่วยให้คุณใช้ประเภททั่วไป T ขณะรันไทม์ได้ (โดยปกติประเภทจะถูกลบออก):
inline fun <reified T> Any.isOfType(): Boolean = this is T
fun main() {
println("hello".isOfType<String>()) // true
println(42.isOfType<String>()) // false
println(3.14.isOfType<Double>()) // true
}ตรวจสอบความเข้าใจ
ฟังก์ชันขอบเขตใดเหมาะที่สุดสำหรับกำหนดค่าให้ออบเจ็กต์ที่เพิ่งสร้างและส่งคืนออบเจ็กต์เดียวกันนั้น
สรุป: ฟังก์ชันขยายและฟังก์ชันลำดับสูง
ตอนนี้คุณพร้อมใช้ชุดเครื่องมือเชิงฟังก์ชันของ Kotlin แล้ว:
- ฟังก์ชันขยาย — เพิ่มพฤติกรรมให้ประเภทใดก็ได้โดยไม่ต้องใช้การสืบทอด
- ฟังก์ชันลำดับสูง — ส่งและส่งคืนฟังก์ชันเพื่อสร้างส่วนติดต่อการเขียนโปรแกรมที่ยืดหยุ่น
- ฟังก์ชันขอบเขต:
let(ตรวจสอบค่า null),apply(กำหนดค่า),also(ผลข้างเคียง),run/with(คำนวณ) inline+reified— แลมบ์ดาที่ไม่มีต้นทุนเพิ่มเติมพร้อมข้อมูลประเภทขณะรันไทม์
ถัดไป: สร้างแอปหลายหน้าจอด้วย Fragments
เรียนรู้ Kotlin ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 36
- บทเรียน
- 152
คำถามที่พบบ่อย
บทเรียน “ฟังก์ชันขยายและฟังก์ชันลำดับสูง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ฟังก์ชันขยายและฟังก์ชันลำดับสูง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันขยายและฟังก์ชันลำดับสูง”
เพิ่มพฤติกรรมให้ชนิดข้อมูลที่มีอยู่ด้วยฟังก์ชันขยาย และใช้ฟังก์ชันลำดับสูงกับฟังก์ชันขอบเขต (let, apply, also, run, with) เพื่อเขียนโค้ด Kotlin ที่สื่อความหมาย คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ฟังก์ชันขยายและฟังก์ชันลำดับสูง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความปลอดภัยของค่า Null
- คลาสและออบเจ็กต์
- คลาสข้อมูลและคลาสปิด
- ฟังก์ชันขยายและฟังก์ชันลำดับสูง