Android Academy · บทเรียน

ฟังก์ชันขยายและฟังก์ชันลำดับสูง

เพิ่มพฤติกรรมให้ชนิดข้อมูลที่มีอยู่ด้วยฟังก์ชันขยาย และใช้ฟังก์ชันลำดับสูงกับฟังก์ชันขอบเขต (let, apply, also, run, with) เพื่อเขียนโค้ด Kotlin ที่สื่อความหมาย

บทเรียน 4 จาก 413 ขั้นตอน

ฟังก์ชันขยายและฟังก์ชันลำดับสูง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ความปลอดภัยของค่า Null
  2. คลาสและออบเจ็กต์
  3. คลาสข้อมูลและคลาสปิด
  4. ฟังก์ชันขยายและฟังก์ชันลำดับสูง
← กลับไปที่ Android Academy