Trong bài viết này, bạn sẽ tìm hiểu về các hàm, hàm là gì, cú pháp của nó và cách tạo hàm trong Kotlin.

Trong lập trình, hàm là một nhóm các câu lệnh liên quan với nhau và thực hiện một thao tác cụ thể nào đó.

Các hàm được sử dụng để chia nhỏ một chương trình lớn thành các phần nhỏ hơn và các mô-đun. Ví dụ: bạn cần tạo và tô màu một vòng tròn dựa trên input được cung cấp bởi người dùng. Bạn có thể tạo hai hàm để giải quyết bài toán này:

  • Hàm createCircle() 
  • Hàm colorCircle() 

Việc chia một chương trình phức tạp thành các thành phần nhỏ hơn giúp chương trình của chúng ta trở nên ngăn nắp, có bố cục rõ ràng và dễ quản lý hơn.

Hơn nữa, điều này giúp ta tránh sự lặp lại và làm cho code có thể tái sử dụng sau này.

1. Các loại hàm

Tùy thuộc vào việc một hàm được xác định bởi người dùng, hoặc có sẵn trong thư viện tiêu chuẩn , ta có thể chia thành hai loại hàm:

  • Hàm thư viện chuẩn của Kotlin
  • Hàm do người dùng định nghĩa

1.1. Hàm thư viện chuẩn của Kotlin

Các hàm thư viện tiêu chuẩn là các hàm được tích hợp trong Kotlin, chúng có sẵn để người dùng sử dụng luôn. Ví dụ,

  • Hàm print() là một hàm thư viện, hàm này in thông báo đến đầu ra tiêu chuẩn (màn hình).
  • Hàm sqrt() trả về căn bậc hai của một số (giá trị thuộc kiểu dữ liệu Double)
fun main(args: Array<String>) {
    var number = 5.5
    print("Result = ${Math.sqrt(number)}")
}

Khi bạn chạy chương trình, kết quả sẽ là:

Result = 2.345207879911715

Click vào liên kết đến Thư viện tiêu chuẩn Kotlin để có thể tìm hiểu nhiều hơn.

1.2. Hàm do người dùng định nghĩa

Như đã đề cập, bạn có thể tự tạo hàm. Các hàm như vậy được gọi là các hàm do người dùng định nghĩa.

1.2.1. Làm thế nào để tạo một hàm do người dùng định nghĩa trong Kotlin?

Trước khi bạn có thể sử dụng (gọi) một hàm, bạn cần xác định nó.

Bạn có thể định nghĩa một hàm trong Kotlin theo cách sau đây:

fun callMe() {
    // function body
}

Để xác định một hàm trong Kotlin, càn sử dụng từ khóa fun. Sau đó đến tên của hàm (định danh). Ở đây, tên của hàm là callMe.

Trong chương trình trên, bên trong dấu ngoặc đơn ( ) là khoảng trống. Điều này có nghĩa là, hàm này không chấp nhận bất kỳ đối số nào cả. Bạn sẽ tìm hiểu về các đối số ở phần sau trong bài viết này.

Phần code bên trong dấu ngoặc nhọn { } là phần thân của hàm.

Làm thế nào để gọi một hàm?

Bạn phải gọi hàm để chạy đoạn code bên trong thân hàm. Sau đây là cách thực hiện điều đó:

callme()

Câu lệnh này gọi hàm callMe() được khai báo trước đó.

Ví dụ: Chương trình đơn giản về hàm 

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

fun callMe() {
    println("Printing from callMe() function.")
    println("This is cool (still printing from inside).")
}

fun main(args: Array<String>) {
    callMe()
    println("Printing outside from callMe() function.")
}

Khi bạn chạy chương trình, kết quả sẽ là:

Printing from callMe() function.
This is cool (still printing from inside).
Printing outside from callMe() function.

Hàm callMe() trong đoạn code trên không chấp nhận bất kỳ đối số nào.

Ngoài ra, hàm không trả về bất kỳ giá trị nào (kiểu dữ liệu trả về là Unit).

Hãy lấy một ví dụ khác về hàm. Hàm dưới đây sẽ chấp nhận đối số và cũng sẽ trả về một giá trị.

Ví dụ: Thêm hai số bằng cách sử dụng hàm

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

fun addNumbers(n1: Double, n2: Double): Int {
    val sum = n1 + n2
    val sumInteger = sum.toInt()
    return sumInteger
}

fun main(args: Array<String>) {
    val number1 = 12.2
    val number2 = 3.4
    val result: Int

    result = addNumbers(number1, number2)
    println("result = $result")
}

Khi bạn chạy chương trình, kết quả sẽ là:

result = 15

Các hàm chấp nhận đối số và giá trị trả về làm việc theo cơ chế nào?

Ở đây, hai đối số number1 và number2 thuộc kiểu dữ liệu Double được truyền cho hàm addNumbers() trong quá trình gọi hàm. Các đối số này được gọi là đối số thực tế.

result = addNumbers(number1, number2)

Những tham số n1 và n2 chấp nhận các đối số được thông qua (trong định nghĩa hàm). Các đối số này được gọi là đối số hình thức (hay còn gọi là tham số).

Trong ngôn ngữ lập trình Kotlin, các đối số phân cách với nhau bằng dấu phẩy. Ngoài ra, kiểu dữ liệu đối số chính thức phải được khai báo rõ ràng.

Hãy lưu ý rằng, kiểu dữ liệu của các đối số thực tế và đối số hình thức phải khớp với nhau, nghĩa là kiểu dữ liệu của đối số thực tế đầu tiên phải khớp với kiểu dữ liệu của đối số hình thức đầu tiên. Tương tự, kiểu dữ liệu của đối số thực tế thứ hai phải khớp với kiểu dữ liệu của đối số chính thức thứ hai, v.v.

Ở đây,

return sumInteger

là câu lệnh trả về. Đoạn code này chấm dứt hàm addNumbers() và điều khiển cho chương trình nhảy đến hàm main().

Trong chương trình, giá trị sumInteger được trả về từ hàm addNumbers(). Giá trị này được gán cho biến result.

Để ý rằng,

  • Cả hai đối số sumInteger và result đều thuộc kiểu dữ liệu Int.
  • Kiểu dữ liệu trả về của hàm được xác định trong định nghĩa hàm.
// return type is Int
fun addNumbers(n1: Double, n2: Double): Int {
    ... .. ...
}

Nếu hàm không trả về bất kỳ giá trị nào, kiểu dữ liệu trả về của nó là Unit. Nếu kiểu dữ liệu trả về là Unit thì không bắt buộc phải xác định kiểu dữ liệu trả về trong phần định nghĩa hàm.

Ví dụ: Hiển thị các tên riêng ra màn hình bằng cách sử dụng hàm

fun main(args: Array<String>) {
    println(getName("John", "Doe"))
}

fun getName(firstName: String, lastName: String): String = "$firstName $lastName"

Khi bạn chạy chương trình, kết quả sẽ là:

John Doe

Ở đây, hàm getName() nhận hai đối số của kiểu dữ liệu String và trả về String.

Nếu hàm trả về một biểu thức duy nhất(như ví dụ trên), bạn có thể bỏ dấu ngoặc nhọn { }của phần thân hàm và xác định phần thân hàm sau ký tự = .

Không bắt buộc phải khai báo kiểu dữ liệu trả về trong trường hợp như trên bởi vì trình biên dịch có thể tự suy ra kiểu dữ liệu trả về. Trong ví dụ trên, bạn có thể thay thế câu lệnh

fun getName(firstName: String, lastName: String): String = "$firstName $lastName"

bằng

fun getName(firstName: String, lastName: String) = "$firstName $lastName"

Trên đây chỉ là phần giới thiệu ngắn gọn về các hàm trong Kotlin. Hãy đọc các bài viết được đề xuất liên quan đến hàm như:

  • Hàm nội tuyến trong Kotlin
  • Hàm kết hợp trong Kotlin
  • Phạm vi của hàm trong Kotlin
  • Các đối số mặc định và đối số được đặt tên trong Kotlin
  • Đệ quy trong Kotlin
  • Hàm đệ quy đuôi trong Kotlin
  • Hàm mở rộng trong Kotlin
  • Hàm cấp cao & Lambdas trong Kotlin

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!