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
Là 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 -> {
}
}