Lập trình Kotlin cơ bản – Cú pháp cơ bản trong ngôn ngữ Kotlin

18/09/2022 - lượt xem
Chia sẻ
 
5/5 - (1 bình chọn)

Trong bài viết này, chúng ta cùng nhau tìm hiểu về cú pháp cơ bản trong lập trình Kotlin. Về bản chất, các cú pháp cơ bản trong Kotlin cũng tương tự như các ngôn ngữ lập trình khác, đặc biệt là java… Hi vọng rằng bài viết này sẽ giúp bạn hiểu nhanh và rõ ràng hơn về cú pháp lập trình Kotlin.

Tìm hiểu thêm Kotlin là gì và hướng dẫn cài đặt Kotlin

Khai báo Package và import Package trong Kotlin

Khai báo Package được đặt trên cùng của file mã nguồn chương trình.

package my.demo

import kotlin.text.*

// ...

Tên của package không nhất thiết phải khớp với cấu trúc thư mục của tệp tin.

Hàm main trong Kotlin – Program Entry Point

Entry point của ứng dụng Kotlin là hàm main, hàm main được định nghĩa như sau

fun main() {
    println("Hello world!")
}

Ngoài ra hàm main trong kotlin có thể nhận một mảng các tham số đầu vào dưới dạng String như sau

fun main(args: Array<String>) {
    println(args.contentToString())
}

In dữ liệu ra màn hình trong Kotlin

Không giống trong Java, đển in dữ liệu ra màn hình với Kotlin sẽ sử dụng hàm Print hoặc Println để in dữ liệu theo từng dòng. Xem thêm bài viết chương trình hello world trong Kotlin.

print("Hello ")
print("world!")
//Kết quả: Hello world!

Hàm println ngoài việc in dữ liệu ra sẽ chèn xuống dòng sau mỗi lần thực thi

println("Hello world!")
println(42)

//Kết quả:
Hello world!
42

Định nghĩa Function – hàm trong Kotlin

Hàm trong Kotlin được định nghĩa như sau

fun tên hàm (tham số: kiểu dữ liệu): kiểu trả về{
// nội dung hàm
}

Ví dụ một hàm với 2 tham số là kiểu Int và kiểu trả về là Int sẽ được định nghĩa như sau:

fun sum(a: Int, b: Int): Int {
    return a + b
}

nội dung một có thể là 1 dạng biểu thức, kiểu dữ liệu trả về được tự động suy ra.

fun sum(a: Int, b: Int) = a + b

Khai báo biến trong Kotlin

Từ khóa val trong kotlin dùng để khai báo biến chỉ được phép đọc (Read-only variable). Các biến dạng này chỉ được phép gán dữ liệu 1 lần duy nhất.

val a: Int = 1  // immediate assignment
val b = 2   // `Int` type is inferred
val c: Int  // Type required when no initializer is provided
c = 3       // deferred assignment

Từ khóa var dùng đề khai báo biến có thể gán dữ liệu nhiều lần

var x = 5 // `Int` type is inferred
x += 1

Biến cũng có thể khai bảo ở ngoài phạm vi hàm

val PI = 3.14
var x = 0

fun incrementX() { 
    x += 1 
}

Trong Kotlin, Tạo class và instance như thế nào?

Để định nghĩa một class chúng ta sử dụng từ khóa class, ví dụ

class Shape

Các thuộc tính của 1 lơp cso thể được liệt kê trong phần khai báo hoặc phần thân của class đó.

class Rectangle(var height: Double, var length: Double) {
    var perimeter = (height + length) * 2
}

Hàm khởi tạo mặc định với tham số được liệt kê trong phần định nghĩa class có thể truy cập được từ instance

val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")

Để thực hiện kế thừa class với Kotlin chúng ta sử dụng dấu hai chấm (:). Mặc định các class ở dạng final, để một class có thể kế thừa cần sử dụng từ khóa open

open class Shape

class Rectangle(var height: Double, var length: Double): Shape() {
    var perimeter = (height + length) * 2
}

Comment trong Kotlin

Giống như hầu hết các ngôn ngữ lập trình khác, Kotlin hỗ trợ comment dạng 1 dòng và nhiều dòng (single line comment và mult-line/block comment)

// This is an end-of-line comment

/* This is a block comment
   on multiple lines. */

Với comment dạng block có thể ở dạng lồng nhau

/* The comment starts here
/* contains a nested comment *⁠/
and ends here. */

String templates

var a = 1
// simple name in template:
val s1 = "a is $a" 

a = 2
// arbitrary expression in template:
val s2 = "${s1.replace("is", "was")}, but now is $a"

Template trong Kotlin 1 phần nào đó giống với PHP và 1 phần nào đó giống với Javascript. Các bạn có thể xem thêm các hàm xử lý chuỗi trong Kotlin.

Biểu thức điều kiện trong Kotlin – lệnh if trong Kotlin

Sử dụng biểu thức điều kiện if trong Kotlin cũng tương tự như các ngôn ngữ lập trình khác.

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

Lệnh if cũng có thể viết dạng ngắn gọn hơn như sau

fun maxOf(a: Int, b: Int) = if (a > b) a else b

Vòng lặp for trong Kotlin

Để tạo ra một mảng, ta có thể dùng hàm listOf với tham số truyền vào là danh sách các phần tử.

Các bạn cũng có thể tham khảo thêm các hàm xử lý mảng trong Kotlin

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}
//Kết quả
apple 
banana 
kiwifruit

Để lấy thứ tự phần tử trong mảng ta sử dụng từ khóa indices

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}
//kết quả:
item at 0 is apple 
item at 1 is banana 
item at 2 is kiwifruit

Vòng lặp while với Kotlin

val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

Biểu thức when trong Kotlin

Trong ngôn ngữ lập trình Kotlin không có switch case thay vào đó là biểu thức when

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

Ranges trong Kotlin

Để kiểm tra 1 số có nằm trong range hay không sử dụng toán tử in

val x = 10
val y = 9
if (x in 1..y+1) {
    println("fits in range")
}
//kết quả
fits in range

Kiểm tra 1 số nằm ngoài khoảng range

val list = listOf("a", "b", "c")

if (-1 !in 0..list.lastIndex) {
    println("-1 is out of range")
}
if (list.size !in list.indices) {
    println("list size is out of valid list indices range, too")
}

//kết quả
-1 is out of range
list size is out of valid list indices range, too

In các phần tử trong 1 range – iterate

for (x in 1..5) {
    print(x)
}
//kết quả
12345

Ngoài ra có thể thay đổi bước nhảy, ví dụ là bước nhảy bằng 2

for (x in 1..10 step 2) {
    print(x)
}
//kết quả
13579

In các phần tử theo chiều giảm dần

for (x in 9 downTo 0 step 3) {
    print(x)
}
//kết quả
9630

Collections trong Kotlin

Collection có thể hiểu rằng là tập hợp các phần tử tương tự như một array.

for (item in items) {
    println(item)
}

Kiểm tra 1 collection có chứa 1 đối tượng – object bằng cách sử dụng toán tử in

when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is fine too")
}

Sử dụng biểu thức lambda để lọc và map collection:

val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.uppercase() }
    .forEach { println(it) }

//kết quả
APPLE
AVOCADO

Nullable và check null trong Kotlin

Kiểu dữ liệu tham chiếu phải được đánh dấu là Nullable khi nó có thể nhận giá trị null. Kiểu Nullable có ? ở cuối.

Hàm dưới đây sẽ trả về null nếu str không chưa một số nguyên.

fun parseInt(str: String): Int? {
    // ...
}

Cách sử dụng một hàm trả về giá trị nullable:

Chúng ta phải check các biến dữ liệu khác null trước khi thực hiện.

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // Using `x * y` yields error because they may hold nulls.
    if (x != null && y != null) {
        // x and y are automatically cast to non-nullable after null check
        println(x * y)
    }
    else {
        println("'$arg1' or '$arg2' is not a number")
    }    
}

Hoặc ta có thể sử dụng như sau

// ...
if (x == null) {
    println("Wrong number format in arg1: '$arg1'")
    return
}
if (y == null) {
    println("Wrong number format in arg2: '$arg2'")
    return
}

// x and y are automatically cast to non-nullable after null check
println(x * y)

Kiểm tra kiểu dữ liệu và tự động ép kiểu trong Kotlin

Toán tử is kiểm tra nếu 1 biểu thức là 1 instance (thực thể) của 1 kiểu dữ liệu. Nếu 1 biến hoặc một thuộc tính local được kiểm tra xem có phải 1 kiểu dữ liệu cụ thể nào không, thì không cần phải ép kiểu một cách tường minh.

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // obj được tự động ép kiểu sang kiểu String
        return obj.length
    }

    // obj vẫn là kiểu Any nằm ngoài nhánh check kiểu dữ liệu
    return null
}

Hoặc

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // `obj` tự động ép kiểu sang String trong nhánh này
    return obj.length
}

Hoặc thậm chí là như sau

fun getStringLength(obj: Any): Int? {
    // `obj` is automatically cast to `String` on the right-hand side of `&&`
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

Trong bài viết này Codetutam đã gợi ý các cú pháp cơ bản liên quan tới Kotlin. Để tìm hiểu rõ thêm về các cú pháp cơ bản cũng như nâng cao của Kotlin các bạn có thể xem thêm trên trang chủ của ngôn ngữ Kotlin.

Nếu bạn muốn thực hiện ngay một app nho nhỏ nào để rèn luyện kiến của mình. Các bạn có thể tham khảo bài hướng dẫn viết tool gửi tin nhắn trong Android.

Bài viết được dịch từ https://kotlinlang.org/docs/basic-syntax.html

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    5/5 - (1 bình chọn)

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm