Thứ Hai, 30 tháng 10, 2017

Kotlin cơ bản: Function


Function - khai báo trong Kotlin với từ khóa fun.
ví dụ:

fun sayHello(name: String) : String {
        return "Hello " + name
}

hoặc dùng ký hiệu $ để lấy giá trị của name như sau:
fun sayHello(name: String) : String {
        return "Hello $name"}

Function trên nhận 1 tham số truyền vào là name, kiểu String.
Kiểu trả về của function cũng là String.

Gọi hàm:

fun main(args: Array<String>) {
        val result: String = sayHello("Viet nam")
        println(result)
    }

Trong java hay c++ nếu function không trả về gì thì dùng từ khóa void. Nhưng trong Kotlin thì dùng từ khóa Unit

ví dụ:
fun print(name: String): Unit {
    println(name)
}

Bỏ qua từ khóa Unit thì chương trình vẫn chạy bình thường.

Biến hàm thành biểu thức trong Kotlin:
ví dụ:
fun getArea(width: Long, height: Long): Long {
    return width*height
} 

hàm trên chúng ta có thể viết lại như sau:
fun getArea(width: Long, height: Long) = width*height

có thể thêm kiểu trả về của function nếu bạn muốn
fun getArea(width: Long, height: Long): Long = width*height

Trong Kotlin khi gọi hàm có nhiều hơn 1 tham số truyền vào, ta ko nhất thiết phải truyền các tham số theo thứ tự bằng cách sử dụng tên của tham số.
ví dụ:
getArea(height = 14, width = 12)

hàm getArea theo định nghĩa thì width là tham số 1, height là tham số 2. Nhưng bằng cách chỉ định tên của tham số thì vấn đề thứ tự tham số truyền vào không quan trọng nữa.

Khi định nghĩa 1 hàm có tham số truyền vào, chúng ta có thể gán giá trị mặc định cho tham số:
fun getArea(width: Long, height: Long = 10): Long = width*height 

ta thấy tham số thứ 2 height được gán giá trị mặc định là 10.
nên khi gọi hàm, nếu ta ko truyền vào giá trị cho tham số height thì Kotlin sẽ lấy giá trị mặc đinh
getArea(12)

nếu trường hợp bạn truyền tham số đầy đủ thì Kotlin sẽ tính theo giá trị bạn truyền vào.

Trong java thì ko có khái niệm giá trị tham số truyền vào có giá trị mặc định như trên, nên nếu muốn khi trong dự án mà dùng cả Kotlin và Java thì ta thêm chú thích (annotation) sau cho hàm:

@JvmOverloadsfun getArea(width: Long, height: Long = 10): Long = width*height

như vậy khi biên dịch thì trình biên dịch sẽ sinh ra thêm 1 hàm overload (không có tham số mặc đinh)
mã java sinh ra thêm khi biên dịch nếu thêm @JvmOverloads
long getArea(long width);

Hàm không giới hạn tham số truyền vao
ta thêm từ khóa vararg trước tên tham số truyền vào
fun sayHello(vararg names: String) {
    for(name in names) {
        println("Hello $name")
    }
}

khi gọi hàm, truyền vào nhiêu tham số thì sẽ in ra mấy nhiêu giá trị name
sayHello("xin chao", "hello", "hola")

Hàm trả về 2 giá trị
ta thêm từ khóa Pair trong kiểu trả về của hàm
fun returnTwoValue(id: Int): Pair<Int?, Int?> {

    val values1: Map<Int, Int> = mapOf(1 to 100, 2 to 200, 3 to 300)
    val values2: Map<Int, Int> = mapOf(1 to 1000, 2 to 2000, 3 to 3000)

    val value1 = values1[id]
    val value2 = values2[id]
    return Pair(value1, value2)
}

2 giá trị trả về có thể khác kiểu
fun returnTwoValue(id: Int): Pair<Int?, String?> {

    val values1: Map<Int, Int> = mapOf(1 to 1, 2 to 2)
    val values2: Map<Int, String> = mapOf(1 to "Hanoi", 2 to "Saigon")

    val value1 = values1[id]
    val value2 = values2[id]
    return Pair(value1, value2)
}

Lấy giá trị trả về
println(returnTwoValue(1).first)
println(returnTwoValue(1).second)

Nếu muốn trả về 3 giá trị, Kotlin hỗ trợ với từ khóa Triple
fun getNameAddressAndAge(id: Int): Triple<String?, String?, Int?> {

    val Names: Map<Int, String> = mapOf(1 to "My", 2 to "Nam")
    val Addresses: Map<Int, String> = mapOf(1 to "Hanoi", 2 to "Saigon")
    val Ages: Map<Int, Int> = mapOf(1 to 12, 2 to 22)

    return Triple(Names[id], Addresses[id], Ages[id])
}

Lấy giá trị trả về
println(getNameAddressAndAge(1).first)
println(getNameAddressAndAge(1).second)
println(getNameAddressAndAge(1).third)


thelam92

0 nhận xét:

Đăng nhận xét