Hướng dẫn nhanh về Kotlin trong khóa học Khái niệm cơ bản về Kotlin trên Android

Hướng dẫn nhanh về Kotlin này tóm tắt các chủ đề trong khóa học Khái niệm cơ bản về Kotlin trên Android dưới dạng các đoạn mã.

Tìm hiểu thêm

  • Xem Tài liệu về ngôn ngữ Kotlin để biết đầy đủ thông tin.
  • Tham khảo Kotlin Koans (Chuỗi bài tập về Kotlin) để xem thêm các đoạn mã giúp bạn thực hành. Lưu ý: Thao tác này sẽ đưa bạn đến một trang web kotlinlang.org bên ngoài do JetBrains phát triển.

Bài 1

Chương trình Kotlin

chương trình main() nhỏ nhất để in văn bản

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

In một dòng văn bản

println("This is the text to print!")

Nhận xét trong cùng dòng

// This is a comment line.
// This is another comment.

Biến

// Assign once, cannot change.
val age = "5"
val name = "Rover"

// Assign and change as needed.
var roll = 6
var rolledValue: Int = 4

In biến có các mẫu chuỗi

println("You are already ${age}!")
println("You are already ${age} days old, ${name}!")

Loại dữ liệu

Int       // Whole positive and negative numbers and zero
String    // Piece of text between quotes
IntRange  // Setting a range such as 1..6
Boolean   // Can only be true or false

Hàm không có đối số

// Define the function.
fun printHello () {
    println ("Hello Kotlin")
}

// Call the function.
printHello()

Hàm có đối số

fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}

Hàm trả về một giá trị

fun roll(): Int {
     val randomNumber = (1..6).random()
     return randomNumber
}

Toán tử cơ bản

*     // multiplication
/     // division
+     // addition
-     // subtraction
=     // assignment

Toán tử logic

>    // greater than
<    // less than
==   // equal
>=   // greater or equal
<=   // less or equal
!=   // not equal

Tạo số ngẫu nhiên

val randomNumber = diceRange.random()

fun roll() {
     val anotherRandomNumber = (1..6).random()
     println(randomNumber)
}

Kiểm soát luồng chương trình

Lặp lại một thao tác bằng repeat()

fun printBorder() {
    repeat(23) {
        print("=")
    }
}

Lồng ghép vòng lặp repeat()

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

Câu lệnh có điều kiện với if/else

fun main() {
   val num = 4
   if (num > 4) {
       println("The variable is greater than 4")
   } else if (num == 4) {
       println("The variable is equal to 4")
   } else {
       println("The variable is less than 4")
   }
}

Câu lệnh có điều kiện với when

when (rollResult) {
    luckyNumber -> println("You won!")
    1 -> println("So sorry! You rolled a 1. Try again!")
    2 -> println("Sadly, you rolled a 2. Try again!")
    3 -> println("Unfortunately, you rolled a 3. Try again!")
    4 -> println("No luck! You rolled a 4. Try again!")
    5 -> println("Don't cry! You rolled a 5. Try again!")
    6 -> println("Apologies! you rolled a 6. Try again!")
}

Chỉ định kết quả của câu lệnh when cho một biến

// Determine which drawable resource ID to use based on the dice roll.
val drawableResource = when (diceRoll) {
    1 -> R.drawable.dice_1
    2 -> R.drawable.dice_2
    3 -> R.drawable.dice_3
    4 -> R.drawable.dice_4
    5 -> R.drawable.dice_5
    else -> R.drawable.dice_6
}

Lớp

Lớp đơn giản có thuộc tính và phương thức

class Dice {
    var sides = 6

    fun roll() {
        val randomNumber = (1..6).random()
        println(randomNumber)
    }
}

Lớp có thông số

class Dice (val numSides: Int) {

    fun roll(): Int {
        val randomNumber = (1..numSides).random()
        return randomNumber
    }
}

Tạo thực thể

val myFirstDice = Dice(6)

Bài 2

Lớp

Lớp trừu tượng

abstract class Dwelling() {
}

Lớp trừu tượng có một thuộc tính trừu tượng

abstract class Dwelling() {
    abstract val buildingMaterial: String
}

Lớp trừu tượng có một phương thức trừu tượng

abstract class Dwelling() {
    abstract fun floorArea(): Double
}

Đánh dấu một lớp là open để lớp đó có thể phân lớp con

open class RoundHut(residents: Int) {
}

Tạo lớp con bằng cách mở rộng lớp mẹ

class SquareCabin : Dwelling()

Ghi đè một hàm từ lớp cao cấp

override fun floorArea(): Double {
}

Gọi quy trình triển khai lớp cao cấp của một hàm

override fun floorArea(): Double {
    return super.floorArea() * floors
}

Danh sách

Xác định một danh sách chỉ có thể đọc

val numbers = listOf(1, 2, 3, 4, 5, 6)

Lấy kích thước của danh sách

numbers.size

Lấy mục đầu tiên trong danh sách

numbers[0]

Lấy bản sao của danh sách theo thứ tự đảo ngược

listOf("red", "blue", "green").reversed()

Xác định một danh sách các chuỗi có thể thay đổi

val entrees = mutableListOf<String>()

Thêm một mục vào danh sách có thể thay đổi

entrees.add("spaghetti")

Sửa đổi một mục trong danh sách có thể thay đổi

entrees[0] = "lasagna"

Xóa một mục khỏi danh sách có thể thay đổi

entrees.remove("lasagna")

Vòng lặp

Sử dụng vòng lặp for để lặp lại các mục trong một danh sách

for (element in myList) {
    // Perform an operation with each item
    println(element)
}

Sử dụng vòng lặp while để lặp lại các mục trong một danh sách

var index = 0
while (index < myList.size) {
    println(myList[index])
    index++
}

Chuỗi

Số ký tự trong một Chuỗi

val name = "Android"
println(name.length)

Sử dụng một biến trong mẫu Chuỗi

val number = 10
println("$number people")

Sử dụng một biểu thức trong mẫu Chuỗi

val number = 10
val groups = 5
println("${number * groups} people")

Khác

Thao tác chỉ định tăng cường

a += b   // a = a + b
a -= b   // a = a - b
a *= b   // a = a * b
a /= b   // a = a / b

Sử dụng with để đơn giản hóa việc truy cập vào một đối tượng

with(squareCabin) {
    println("Capacity: ${capacity}")
    println("Material: ${buildingMaterial}")
    println("Has room? ${hasRoom()}")
}

Nhập từ thư viện toán học Kotlin

import kotlin.math.PI

Sử dụng tên đủ điều kiện cho một hằng số trong thư viện toán học Kotlin (không cần có câu lệnh nhập)

kotlin.math.PI * radius * radius

Xâu chuỗi các lệnh gọi với nhau (để sử dụng các thuộc tính và phương thức gọi)

val stringInTextField = binding.costOfService.text.toString()

Số lượng đối số hàm có thể thay đổi

fun addToppings(vararg val toppings: String)

Khai báo gói

package com.example.affirmations.model

Bài 3

Nhóm

Tạo một nhóm từ danh sách

val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
val setOfNumbers = numbers.toSet()

Xác định một nhóm

val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3, 4, 5)

Phép toán trên nhóm

set1.intersect(set2) // 3
set1.union(set2) // 1, 2, 3, 4, 5

Sơ đồ

Xác định một sơ đồ có thể thay đổi

val peopleAges = mutableMapOf<String, Int>(
    "Fred" to 30,
    "Ann" to 23
)

Đặt một giá trị trong sơ đồ có thể thay đổi

peopleAges.put("Barbara", 42)
peopleAges["Joe"] = 51

Phép toán trên tập hợp

Lặp lại tập hợp

peopleAges.forEach { print("${it.key} is ${it.value}, ") }
// Fred is 31, Ann is 23, Barbara is 42, Joe is 51,

Chuyển đổi từng mục trong một tập hợp

println(peopleAges.map { "${it.key} is ${it.value}" }.joinToString(", ") )
// Fred is 31, Ann is 23, Barbara is 42, Joe is 51

Lọc các mục trong một tập hợp

val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)
// {Ann=23, Joe=51}

Các phép toán khác trên tập hợp

val words = listOf("about", "acute", "balloon", "best", "brief", "class")
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
    .shuffled() // [brief, balloon, best]
    .take(2) // [brief, balloon]
    .sorted() // [balloon, brief]

Hàm phạm vi

let

arguments?.let {
    letterId = it.getString(LETTER).toString()
}

apply

binding?.apply {
    ...
    flavorFragment = this@FlavorFragment
}

Khác

Thuộc tính dự phòng

private var _currentScrambledWord = "test"
val currentScrambledWord: String
    get() = _currentScrambledWord

Lệnh gọi an toàn

val letterId = intent?.extras?.getString("letter").toString()

Hàm Lambda

val triple: (Int) -> Int = { a: Int -> a * 3 }
println(triple(5))

Đối tượng companion


class DetailActivity: AppCompatActivity() {

    ...

    companion object {
        const val LETTER = "letter"
    }

    ...

}

// accessible outside DetailActivity
DetailActivity.LETTER

Ủy quyền thuộc tính

// syntax
var <property-name> : <property-type> by <delegate-class>()
// example
private val viewModel: GameViewModel by viewModels()

Khởi tạo trễ

private var wordsList: MutableList<String> = mutableListOf() // has a value at initialization
private lateinit var currentWord: String // needs to be assigned after initialization

Toán tử Elvis

var quantity : Int? = null
quantity ?: 0 // 0
quantity = 4
quantity ?: 0 // 4

Bài 4

Coroutine

Khai báo hàm tạm ngưng

suspend fun getValue(): Double {
    // long running work or calls to other suspend functions
}

Chạy một hàm tạm ngưng trong GlobalScope

GlobalScope.launch {
    val output = getValue()
}

Gọi hàm tạm ngưng từ một hàm tạm ngưng khác.

suspend fun processValue() {
    val value = getValue()
    // modify the value
}

Truy cập vào một Tác vụ coroutine

val job: Job = GlobalScope.launch {
    val output = getValue()
}

Hủy một Tác vụ coroutine

job.cancel()

Chạy một hàm tạm ngưng và chặn luồng hiện tại cho đến khi hàm này hoàn tất

runBlocking {
    val output = getValue()
}

Sử dụng hàm không đồng bộ để cho phép trì hoãn hàm tạm ngưng

runBlocking {
    val output = await { getValue() }

    println("Output is ${output.await()}")
}

Khác

Khai báo một đối tượng

object DataProviderManager {

}

Phát hiện một ngoại lệ

try {
    // code that may throw an error
} catch (exception: Exception) {
    // handle the thrown exception
}

Tạo một lớp enum

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

Truy cập vào một giá trị lớp enum

val direction = Direction.NORTH

Kiểm tra các giá trị enum

when (direction) {
    Directon.NORTH -> {

    }
    Direction.SOUTH -> {

    }
    Direction.WEST -> {

    }
    Direction.EAST -> {

    }
}