⚡ Hàm (Function)
🎯 Mục tiêu: Nắm vững cách định nghĩa và sử dụng hàm trong Kotlin với các tính năng hiện đại như default parameters, named arguments, và single-expression functions.
💡 Khái niệm
Phần tiêu đề “💡 Khái niệm”Hàm là block code có thể tái sử dụng, nhận input (parameters) và có thể trả về output (return value).
fun greet(name: String): String { return "Hello, $name!"}
fun main() { println(greet("Kotlin")) // Hello, Kotlin!}📝 Cú pháp định nghĩa hàm
Phần tiêu đề “📝 Cú pháp định nghĩa hàm”Hàm cơ bản
Phần tiêu đề “Hàm cơ bản”fun functionName(param1: Type1, param2: Type2): ReturnType { // body return value}Hàm không có giá trị trả về (Unit)
Phần tiêu đề “Hàm không có giá trị trả về (Unit)”fun printMessage(message: String): Unit { println(message)}
// Unit có thể bỏ quafun printMessage(message: String) { println(message)}⭐ Single-Expression Functions
Phần tiêu đề “⭐ Single-Expression Functions”Khi hàm chỉ có một biểu thức, dùng =:
// Full syntaxfun sum(a: Int, b: Int): Int { return a + b}
// Single-expression (type inferred)fun sum(a: Int, b: Int) = a + b
// Ví dụ khácfun isEven(n: Int) = n % 2 == 0fun double(x: Int) = x * 2fun greet(name: String) = "Hello, $name!"🎯 Default Parameters
Phần tiêu đề “🎯 Default Parameters”fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!")}
fun main() { greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet("Bob", "Hi") // Hi, Bob!}🏷️ Named Arguments
Phần tiêu đề “🏷️ Named Arguments”Gọi hàm với tên tham số để code rõ ràng hơn:
fun createUser( name: String, age: Int, email: String, isAdmin: Boolean = false) { println("User: $name, $age, $email, admin=$isAdmin")}
fun main() { // Positional arguments
// Named arguments - rõ ràng hơn createUser( name = "Bob", age = 30, isAdmin = true )
// Có thể đổi thứ tự với named arguments createUser( name = "Charlie", age = 28 )}📦 Vararg - Số lượng tham số không giới hạn
Phần tiêu đề “📦 Vararg - Số lượng tham số không giới hạn”fun sum(vararg numbers: Int): Int { var total = 0 for (n in numbers) { total += n } return total}
fun main() { println(sum(1, 2, 3)) // 6 println(sum(1, 2, 3, 4, 5)) // 15
// Spread operator để truyền array val arr = intArrayOf(1, 2, 3) println(sum(*arr)) // 6}🔄 Return Types
Phần tiêu đề “🔄 Return Types”Explicit return type
Phần tiêu đề “Explicit return type”fun multiply(a: Int, b: Int): Int { return a * b}Inferred return type (single-expression)
Phần tiêu đề “Inferred return type (single-expression)”fun multiply(a: Int, b: Int) = a * bNothing - hàm không bao giờ return
Phần tiêu đề “Nothing - hàm không bao giờ return”fun fail(message: String): Nothing { throw IllegalStateException(message)}
fun validateAge(age: Int): Int { if (age < 0) fail("Age cannot be negative") return age}🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập 1: Tính giai thừa
fun main() { // TODO: Viết hàm factorial(n) // factorial(5) = 5! = 120}Lời giải:
fun factorial(n: Int): Long { var result = 1L for (i in 2..n) { result *= i } return result}
// Hoặc recursivefun factorialRecursive(n: Int): Long = if (n <= 1) 1 else n * factorialRecursive(n - 1)
fun main() { println(factorial(5)) // 120 println(factorialRecursive(5)) // 120}Bài tập 2: Kiểm tra số nguyên tố
fun main() { // TODO: Viết hàm isPrime(n)}Lời giải:
fun isPrime(n: Int): Boolean { if (n < 2) return false for (i in 2..kotlin.math.sqrt(n.toDouble()).toInt()) { if (n % i == 0) return false } return true}
fun main() { println(isPrime(17)) // true println(isPrime(20)) // false
// In 10 số nguyên tố đầu tiên println((2..100).filter { isPrime(it) }.take(10))}Bài tập 3: Format tên
fun main() { // TODO: Viết hàm formatName với options // formatName("nguyen van a") // formatName("nguyen van a", uppercase = true) // formatName("nguyen van a", reverse = true)}Lời giải:
fun formatName( name: String, uppercase: Boolean = false, reverse: Boolean = false): String { var result = name.trim() .split(" ") .filter { it.isNotBlank() } .joinToString(" ") { it.replaceFirstChar { c -> c.uppercase() } }
if (uppercase) result = result.uppercase() if (reverse) result = result.split(" ").reversed().joinToString(" ")
return result}
fun main() { println(formatName("nguyen van a")) // Nguyen Van A println(formatName(" nguyen van a ")) // Nguyen Van A println(formatName("nguyen van a", uppercase = true)) // NGUYEN VAN A println(formatName("nguyen van a", reverse = true)) // A Van Nguyen}📱 Trong Android
Phần tiêu đề “📱 Trong Android”// Extension function for Viewfun View.show() { visibility = View.VISIBLE }fun View.hide() { visibility = View.GONE }
// Reusable validationfun validateEmail(email: String): Boolean { return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()}
// With default params for click listenerfun View.setThrottleClickListener( throttleTime: Long = 500L, action: (View) -> Unit) { setOnClickListener { isClickable = false action(it) postDelayed({ isClickable = true }, throttleTime) }}⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ Checklist - Tự kiểm tra”Sau bài học này, bạn có thể:
- Định nghĩa hàm với
fun - Sử dụng single-expression functions với
= - Sử dụng default parameters
- Sử dụng named arguments
- Hiểu
UnitvàNothingreturn types - Sử dụng
varargcho số lượng tham số không giới hạn
Tiếp theo: Lambda Expressions