Kotlin Bài 4: Các cấu trúc vòng lặp và điều kiện trong Kotlin

Xin chào, Mình là Dương Vũ, ở bài viết trước mình đã nói về cách truy xuất biến một cách an toàn. Bài này mình sẽ trình bày về các cấu trúc vòng lặp và điều kiện trong Kotlin. Vòng lặp và điều kiện là những tính năng không thể thiếu đối với 1 ngôn ngữ lập trình hiện đại. Và Kotlin còn làm cho chúng trở nên vô cùng thú vị. Cùng tìm hiểu nhé.

[toc]

Các cấu trúc điều kiện

Cấu trúc if và if else

Cấu trúc if kiểm tra tính thoả mãn của 1 điều kiện và thực hiện một (chuỗi) hành động nếu điều kiện đó thoả mãn. Nếu bạn đã từng làm việc với java, bạn sẽ thấy cấu trúc ifif else của Kotlin sử dụng giống hệt như Java. Đây là 1 ví dụ với việc sử dụng if:

val age = 20
if(age>18){
   print("You are adult")
}

bởi điều kiện của cấu trúc if (age>18)  thoả mãn, Màn hình sẽ hiển thị dòng log You are adult. 1 ví dụ với if – else:

val a = 10
val b = 20
if(a>b){
   print("$a > $b")
}else if(a == b){
   print("$a = $b")
}else{
   print("$a < $b")
}

Màn hình sẽ hiển thị ra dòng log 10<20. 

Tuy nhiên ngoài cách sử dụng truyền thống ra, ta có thể dùng cấu trúc if như 1 biểu thức, tức là biểu thức if cũng trả về giá trị, sau đây là ví dụ:

val firstNumber = 10
val secondNumber = 25
var max = if(firstNumber>secondNumber){
   println("$firstNumber is max")
   firstNumber
}else{
   println("$secondNumber is max")
   secondNumber
}
println("Max = $max")

Ta thấy trên đây là bài toán tìm max của 2 số rất đơn giản. Cái hay là trong Kotlin, cấu trúc if có thể return về giá trị và giá trị đó có thể được gán cho 1 biến. Như ở ví dụ trên nếu firstNumber > secondNumber thì cấu trúc if sẽ return về giá trị firstNumber, ngược lại sẽ return về giá trị secondNumber. Chạy đoạn code trên ta sẽ thu được

25 is max
Max = 25

 

Lưu ý: nếu bạn sử dụng if dưới dạng 1 biểu thức, thì cấu trúc if bắt buộc phải có else.

Cấu trúc when

Cấu trúc when tương tự như switch – case của Java hay C. Đây cũng là 1 cấu trúc điều kiện mình rất hay sử dụng. Nó có dạng như thế này

val age = 19
when (age){
   in 1..17 -> print("Child")
   in 18..40 -> print("Adult")
   else -> print("Old")
}

Cấu trúc when kiểm tra tham số đầu vào (ở trường hợp trên là number) với các điều kiện trong thân cấu trúc. Khi bắt gặp điều kiện đúng, các câu lệnh tương ứng với điều kiện đó sẽ được thực hiện và các điều kiện khác sẽ không được xét đến nữa.

Nếu như trong java, các nhánh điều kiện trong cấu trúc switch – case chỉ có thể là hằng số, thì cấu trúc when trong Kotlin tỏ ra mềm dẻo hơn với việc cho phép các điều kiện có thể là các biểu thức, hoặc hàm. Ví dụ:

var numberOne = 19
var numberTwo = 21

when(numberOne){
   numberTwo/2 -> println("$numberOne = $numberTwo /2")
   else -> print("$numberOne != $numberTwo /2")
}

Ví dụ trên kiểm tra xem numberOne có phải là 1 nửa của numberTwo hay không. Ví dụ có vẻ ngu ngốc nhưng mô tả rõ ràng việc sử dụng biến trong các nhánh điều kiện của when :)) Khi chạy đoạn code trên ta thu đc dòng log: 19 != 21 /2.

Nếu ta thay giá trị của  numberTwo = 38 thì ta sẽ thấy log 19 = 38 /2.

Vậy ta có cấu trúc tổng quát của when là thế này

when(tên_biến){
   điều_kiện_1 -> { chuỗi lệnh xử lý 1  }
   điều_kiện_2 -> { chuỗi lệnh xử lý 2  }
   ……
   else -> { chuỗi lệnh xử lý ngoại lệ }
}

Lưu ý: nếu chỉ có 1 dòng lệnh thì ta có thể không dùng cặp { }

Vòng lặp

Vòng lặp được sinh ra để thực hiện lặp đi lặp lại 1 công việc nào đó. Kotlin cung cấp cho ta 3 dạng vòng lặp là while, do … while và for. Mình sẽ tìm hiểu từng loại 1 nhé.

Vòng lặp while

Đây là 1 dạng vòng lặp có điều kiện. Vòng lặp sẽ chạy chừng nào điều kiện đó vẫn còn đang đúng. Nếu ai đã code Java thì sẽ thấy vòng lặp while trong Kotlin không khác gì Java cả. Ví dụ:

var age = 1
while (age<100){
   println("Now i am $age years old")
   age++
}
print("i die T_T")

Trên đây là ví dụ về vòng đời của 1 người. Vòng lặp sẽ chạy chừng nào điều kiện age<100 còn thỏa mãn. Và các bạn thấy khi run đoạn lệnh trên console sẽ hiển thị:

Now i am 2 years old
Now i am 3 years old
…
Now i am 100 years old
i die T_T

Vòng lặp do … while

var age = 1
do {
   println("Now i am $age years old")
   age++
} while (age <= 100)
print("i die T_T")

Đây là cách viết khác của ví dụ vòng đời trên sử dụng vòng lặp do … while. Vẫn là sống từ 1 đến 100 tuổi rồi chết. Vòng lặp do … while thực tế cũng gần giống như vòng lặp while. Cũng là dạng vòng lặp có điều kiện. Chỉ khác 1 điều là, ở vòng chạy đầu tiên thì điều kiện sẽ không được xem xét. Có nghĩa là với vòng lặp do … while, sẽ có ít nhất 1 vòng được thực thi. Để thấy rõ, bạn hãy thử đặt giá trị khởi tạo của biến age là 101. Khi đó dù age không thoả mãn điều kiện (age <= 100) nhưng vẫn sẽ có 1 câu lệnh được in ra: Now i am 101 years old.

Vòng lặp for

Vòng lặp for duyệt qua tất cả các phần tử trong 1 mảng (array) hoặc danh sách (list) và xử lý giá trị ứng với mỗi phần tử. Ví dụ:

for (i in 1..5) {
    print("$i ") // in ra  1 2 3 4 5
}

Ok, giờ ta muốn mỗi vòng lặp nhảy 2 đơn vị thì sao? Ta sẽ làm thế này:

for (i in 1..5 step 2) {
    print("$i ") // in ra  1 3 5
}

Đơn giản là thêm từ khoá step và cuối điều kiện lặp.

Thế nếu ta muốn duyệt từ 5 trở về 1 thì sao? Ta có từ khoá downto giúp ta làm việc đó:

for (i in 5 downTo 1) {
   print("$i ") //in ra 5 4 3 2 1
}

Và duyệt từ 5 trở về 1, mỗi vòng lặp nhảy 2 đơn vị:

for (i in 5 downTo 1 step 2) {
   print("$i ") //in ra 5 3 1
}

Sử dụng vòng for để duyệt qua các phần tử của 1 mảng (Array):

val listOfNumber = listOf<Int>(1, 2, 3, 4, 5, 6)
for (number in listOfNumber){
   if(number%2==0){
       println("$number is even number")
   }else{
       println("$number is odd number")
   }
}

Ví dụ trên khởi tạo 1 list các số nguyên và duyệt qua list đó, in ra console tính chẵn lẻ của từng phần tử. Đơn giản đến mức ko thể giải thích rõ hơn, đúng ko? Thêm 1 ví dụ nữa nhé:

val listName = arrayOf("Neymar", "Vidal", "Rooney", "Ronaldo", "Messi", "Bale")
for (name in listName) {
   if (name.startsWith("R")) {
       println(name)
   }
}

Ví dụ trên khởi tạo 1 mảng các tên cầu thủ, sau đó sử dụng vòng lặp để duyệt qua tất cả các phần tử trong mảng đó, phần tử nào bắt đầu bằng ký tự R thì sẽ log ra màn hình. Kết quả:

Rooney
Ronaldo

Ngoài cách trên ra ta cũng có thể duyệt mảng bằng cách khác, đó là duyệt qua chỉ số:

val listNumber = listOf<Int>(1, 3, 2, -1, 4, 6, 7)
var sum = 0
for (index in 0..listNumber.size - 1) {
   sum += listNumber.get(index)
}
print("Summary of list: $sum")

Đây là bài toán đơn giản tính tổng 1 mảng. Nhưng ở ví dụ này ta duyệt mảng thông qua chỉ số (thứ tự) chứ ko duyệt trực tiếp qua các phần tử của listNumber. Bản chất của việc này là ta tạo ra 1 list chỉ số: 0..listNumber.size – 1 gồm các giá trị từ 0 đến listNumber.size – 1. Sau đó ta duyệt list này để lấy các chỉ số (index) của  listNumber và truy xuất các phần tử của listNumber thông qua index, phục vụ cho việc tính tổng.

Break và continue

Lưu ý: breakcontinue trong Kotlin giống hệt như trong java, anh em nào biết rồi thì có thể bỏ qua không đọc :))

breakcontinue là 2 từ khóa để tạo ra các bước nhảy trong vòng lặp. Cụ thể:

break dùng để thoát ra khỏi vòng lặp.

continue dùng để lập tức chuyển tới vòng lặp tiếp theo, bỏ qua các câu lệnh còn lại của vòng lặp hiện tại.

breakcontinue có thể dùng được trong mọi thể loại vòng lặp, dù có là for hay while hay là do – while vẫn ok tất. Ví dụ về break

for(age in 1..100){
   println("Now i am $age years old")
   if(age == 25){
       println("i see girl when ride motorbike, then i hug a big tree in the road")
       break
   }
}
print("i die T_T")

Vẫn là ví dụ về vòng đời, nhưng ở đây có chút khác biệt. Khi age có giá trị là 25, thanh niên console đi xe máy ra ngoài đường và ngắm gái, kết quả là đâm vào cây và hẹo. Thế nên ta dùng lệnh break để thoát khỏi vòng lặp for(age in 1..100)  dù age mới có giá trị là 25. Kết quả hiện ra trên màn hình

Now i am 1 years old
Now i am 2 years old
…..
Now i am 25 years old
i see girl when ride motorbike, then i hug a big tree in the road
i die T_T

Ví dụ về continue:

var level = 1
while (level <= 10) {
   if (level == 3) {
       level += 6
       println("I have a special gift code, my level up!!!")
       continue
   }
   println("My level is $level")
   level++

}

Đây là 1 ví dụ về 1 anh cày game, ở mỗi level của anh ấy đều có 1 dòng log println(“My level is $level”), tuy nhiên khi đang ở level 3 thì anh ấy nhận được gift code khủng nên nhảy 1 phát lên level 9: level += 6 và bỏ qua dòng log println(“My level is $level”) ở vòng lặp khi level = 3. Điều này có được nhờ câu lệnh continue, nó sẽ bỏ qua tất cả những câu lệnh ở phía sau nó (trong vòng lặp) và lập tức chuyển sang vòng lặp tiếp theo.

Ví dụ khác:

for (number in 1..10) {
   if (number % 2 == 0) {
       continue
   }
   print("Number = $number")
}

Tổng kết

Như vậy, cơ bản mình đã trình bày xong về Các cấu trúc vòng lặp và điều kiện trong Kotlin.

Đến đây ta đã có những trang bị kiến thức:

  • Các kiểu dữ liệu cơ bản
  • Các kiểu dữ liệu mảng, danh sách
  • Kiểu dữ liệu nullable, các cách sử dụng biến an toàn (tránh NullPoiterException)
  • Cấu trúc điều kiện if, if-else, when
  • Các dạng vòng lặp for, while
  • Các cách ngắt vòng lặp sử dụng break, continue

Đây là các thành phần cơ bản nhất mà ngôn ngữ nào cũng phải cung cấp. Đối với ai đã từng làm với Java chắc ko có khó khăn gì. Bài tiếp theo sẽ bắt đầu trình bày về các kiến thức liên quan đến cách sử dụng hàm trong Kotlin. Và những sự ưu việt của Kotlin so với Java (tất nhiên là về cú pháp). Rất mong các bạn sẽ ủng hộ mình.

Kotlin Bài 2: Biến và các kiểu dữ liệu cơ bản trong Kotlin

Xin chào, mình là Dương Vũ. Hôm nay mình sẽ trình bày về các kiểu dữ liệu cơ bản trong Kotlin. Sau bài này các bạn có thể biết cách khai báo biến, hằng số. Đồng thời các bạn cũng có kiến thức về các kiểu dữ liệu cơ bản trong Kotlin (mà thực ra là trong mọi ngôn ngữ lập trình). Các bạn cũng có kiến thức về mảng, danh sách, cách thức làm việc với chúng trong Kotlin. Yeah, bắt đầu nhé!

[toc]

Biến và hằng số

Biến

Trong Kotlin, chúng ta dùng từ khoá var để khai báo 1 biến và dùng từ khoá val để khai báo 1 hằng. Biến có thể thay đổi được giá trị còn hằng số thì không. Ví dụ, ta có thể khai báo biến như sau:

var myName:String = "Duong Vu"
var myAge:Int = 25
var isMeGay:Boolean = false

Ở trên đây mình đã khai báo các biến myName, myAge, isMeGay. Mỗi biến đều được khai báo kiểu dữ liệu và giá trị ban đầu của nó. Chắc các bạn cũng dễ dàng nhận thấy cú pháp khai báo biến sẽ là:

var tên_biến:kiểu_dữ_liệu = giá_trị_khởi_tạo

Cách khai báo biến này cũng tương tự với cách khai báo bên Java:

String myName = "Duong Vu";
int myAge = 25;
boolean isMeGay = false;

Tuy nhiên ở bên Kotlin có 1 sự tiện lợi hơn Java, đó là khi khai báo biến ta có thể không cần chỉ ra kiểu dữ liệu. Ví dụ như sau:

var myName = "Duong Vu" //biến myName sẽ được hiểu là kiểu String và có giá trị là Duong Vu
var myAge = 25 // biến myAge sẽ được hiểu là kiểu Int và có giá trị là 25
var isMeGay = true //biến isMeGay sẽ được hiểu là kiểu Boolean và có giá trị là false

Có nghĩa là khi ta khai báo biến có giá trị khởi tạo, Kotlin sẽ tự động gán kiểu cho biến dựa vào giá trị khởi tạo đó.

Hằng số

Hằng số hoàn toàn tương tự như biến số. Chỉ khác là chúng không thể thay đổi giá trị như biến số. Hằng số được khai báo bởi từ khoá val:

val pi = 3.14f
val daysOfWeek = 7
val hoursOfDay = 24

Lưu ý: nếu bạn cố thay đổi giá trị của 1 hằng số, bạn sẽ nhận được thông báo sau: Val cannot be reassigned (hằng số không thể được gán lại gía trị). Ví dụ thế này

val pi = 3.14f
pi = 6.28f

Bạn sẽ nhận ngay thông báo lỗi từ IDE. Hãy tự thử nghiệm thêm nhé!

Các kiểu dữ liệu cơ bản

Kiểu dữ liệu số

Trong Kotlin có nhiều kiểu dữ liệu để biểu diễn số. Nhưng về cơ bản cũng tương tự Java thôi. Kotlin cung cấp những kiểu dữ liệu số sau:

Các kiểu số nguyên

  • Long – 64 bit
  • Int – 32 bit
  • Short – 16 bit
  • Byte – 8 bit

Các kiểu số thực

  • Double – 64 bit
  • Float – 32 bit

Ví dụ:

var varInt = 63
var varLong = 4L
var varFloat = 9.32F
var varDouble = 55.55
var varBinary = 0b000111
var varHexadecimal = 0x1F

Lưu ý: Khi khởi tạo 1 biến số thực, mặc định Kotlin sẽ hiểu biến đó có kiểu Double. Ví dụ:

var pi = 3.4 //Khi này biến pi được hiểu là kiểu Double

Nếu muốn khởi tạo 1 biến dạng Float ta cần thêm ký tự f hoặc F đằng sau giá trị:

var pi = 3.4f //Khi này biến pi được hiểu là kiểu Float

Tương tự với biến số nguyên, mặc định sẽ được hiểu là kiểu Int:

var year = 2018 // Khi này biến year được hiểu là kiểu Int

Nếu muốn đưa nó về dạng long, ta thêm ký tự L sau giá trị:

var year = 2018L // Khi này biến year được hiểu là kiểu Long

Chuyển đổi giữa các kiểu dữ liệu số

Tất cả các kiểu dữ liệu số đều được cung cấp các hàm để chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác. Ví dụ:

var myInt = 100 // Khởi tạo biến myInt với giá trị 100
var myDouble = myInt.toDouble() //chuyển đổi sang kiểu Double
var myLong = myInt.toLong() //chuyển đổi sang kiểu Long
var myFloat = myInt.toFloat() //chuyển đổi sang kiểu Float
var myByte = myInt.toByte() //chuyển đổi sang kiểu Byte

Như vậy mình có thể convert 1 biến từ kiểu này sang kiểu kia 1 cách dễ dàng.

Lưu ý: Ta không thể trực tiếp gán giá trị của 2 biến khác kiểu như sau:

val myInt = 100
val myLong: Long = myNumber // lỗi: Type mismatch

Kiểu dữ liệu Boolean

Kiểu Boolean trong Kotlin hoàn toàn giống với Java. Giá trị của kiểu dữ liệu này là true hoặc false. Các toán tử đối với kiểu Boolean cũng hoàn toàn giống Java:

  • || (hoặc)
  • && (và)
  • ! (phủ định)

Ví dụ:

val myTrue = true
val myFalse = false
 
val a = 1
val b = 3
val c = 4
val d = 6
 
val result = a < b && d > c // result có giá trị true

Kiểu dữ liệu String

String biểu diễn dữ liệu dạng chuỗi ký tự. Trong Kotlin có 2 dạng String.

  • Dạng thông thường: các ký tự trong String đc biểu diễn trong cặp ngoặc kép, dạng này khá giống với String trong Java:
var myName = "My name is Duong Vu"

Khi muốn hiển thị các ký tự đặc biệt ,ví dụ như xuống dòng, ta phải dùng cách sử dụng ký hiệu. Ví dụ để tạo 1 string chứa 3 dòng ta phải làm như sau:

var myString = "This is first line\nThis is second line\nThis is first line"
println(myString)

Lưu ý: Ở trên mình đã sử dụng câu lệnh println để in ra giá trị của chuỗi myString trên console. Hàm println có thể in ra giá trị của tất cả các biến, không riêng gì biến kiểu String.

Kết quả in ra ở console sẽ là:

This is first line
This is second line
This is first line

Như mọi người thấy ta phải dùng \n để thay cho ký tự xuống dòng. Nhưng với dạng String thứ 2 thì khác. 

  • Dạng thứ 2: các ký tự trong String được biểu diễn trong cặp dấu nháy 3 “””. Ví dụ:
var text = """
   this is first line
       this is second line
           this is third line
"""
println(text)

Kết quả:

   this is first line
       this is second line
           this is third line

Với dạng này ta có thể sử dụng xuống dòng, tab hay bất kỳ 1 ký tự đặc biệt nào 1 cách thoải mái. Cứ như kiểu ta đang soạn thảo văn bản vậy :3

  • String template

Nếu trong Java, để hiển thị giá trị của 1 biến số trong 1 chuỗi thì ta phải dùng phép cộng chuỗi hoặc String.format. Thì ở Kotlin, mọi việc đơn giản và trực quan hơn rất nhiều. String trong Kotlin cho phép ta gắn giá trị của 1 biến vào thân chuỗi chỉ với ký tự $. Ví dụ:

var numberOfApples = 4
var numberOfBananas = 5
var numberOfOrange = 2

var fruitDescription = "There are $numberOfApples apples, $numberOfBananas bananas, $numberOfOrange oranges"
print(fruitDescription)

Thế là giá trị của các biến numberOfApples ,numberOfBananas, numberOfOrange được gắn vào String cực kỳ gọn nhẹ. Ví dụ 2:

var numberOfRedCar = 2
var numberOfBlueCar = 3

var carDescription = "There are ${numberOfBlueCar+numberOfRedCar} cars"
print(carDescription)

Ví dụ này cho thấy, khi muốn biểu diễn giá trị của 1 biểu thức (hoặc là hàm số) thì biểu thức (hàm số) đó phải được bao bởi cặp {}. Như ví dụ trên mình đã dùng ${numberOfBlueCar+numberOfRedCar} để biểu diễn tổng của 2 biến numberOfBlueCarnumberOfRedCar đó. Ví dụ nữa :

var myString = "Hello, I am Mr.Rain"
print("String length = ${myString.length}")

Kiểu dữ liệu mảng

Mảng (Array) là 1 tập hợp các phần tử. Trong Kotlin có 2 cách để tạo ra mảng, đó là sử dụng phương thức

arrayOf()

hoặc dùng hàm khởi tạo:

Array()

Ví dụ, ta thử tạo 1 mảng chứa các số nguyên và số thực sử dụng phương thức arrayOf()

val firstArray = arrayOf(1, 3, 5, 7, 9, 11f, 13f)

Ta vừa khởi tạo 1 mảng có số phần tử là 7 và các phần tử như trên. Nếu muốn tất cả các phần tử của mảng phải có cùng kiểu dữ liệu, ta cần khai báo kiểu dữ liệu bằng cách sau:

val intArray = arrayOf<Int>(4, 5, 7, 3, 1, 0)

Như ở ví dụ trên ta đã khai báo kiểu Int cho array cần khởi tạo. Có 1 cách khác như thế này:

val intArray = intArrayOf(4, 5, 7, 3, 1, 0)

Kotlin cũng cung cấp cho ta các hàm để tạo mảng chứa kiểu dữ liệu cơ bản khác:

charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

Giờ ta sẽ thử dùng hàm khởi tạo Array() để tạo ra 1 mảng. Hàm này yêu cầu truyền vào size (số phần tử) và 1 lambda function. Mình sẽ tìm hiểu về lambda function trong những bài viết sau, giờ ta chỉ cần hiểu đơn giản đó là 1 hàm không có tên, và thực hiện thao tác với tham số đầu vào là chỉ số của mảng:

val numbersArray = Array(4, { i -> i * 3 })

Trong đoạn code trên, ta đã truyền vào size của mảng là 4. Và 1 lambda function sử dụng tham số đầu vào là chỉ số của mảng để tính toán giá trị của phần tử ứng với chỉ số đó (giá trị bằng 3 lần chỉ số). Mảng numbersArray trên có cùng giá trị với mảng:

val numbersArray = arrayOf<Int>(0, 3, 6, 9)

Đơn giản đúng không?

Comment – Chú thích

Comment là những đoạn code không được biên dịch, có vai trò ghi chú, chú thích trong code. Comment trong Kotlin giống hệt với Java:

/*
 This is a multiple lines comment
 This is first line.
 This is seconde line
*/
 
// 1 line comment

Kết luận

Ở bài này mình đã giới thiệu về biến, hằng số, các kiểu dữ liệu cơ bản của Kotlin, mảng, comment. Bài sau mình sẽ giới thiệu 1 kiến thức cực kỳ thú vị (và quan trọng) trong lập trình Kotlin. Đó là cách kiểm tra biến null an toàn trong Kotlin. Các bạn hãy đọc và cho ý kiến nhé.

 

Kotlin Bài 1: Giới thiệu loạt bài hướng dẫn lập trình Kotlin

Chào mọi người, mình là Dương Vũ. Hôm nay mình sẽ viết bài đầu tiên trong loạt bài hướng dẫn lập trình Kotlin, sử dụng trong quá trình phát triển ứng dụng Android. Đây sẽ là loạt bài đầu tiên mình chia sẻ đến những ai yêu thích lập trình di động. Các kiến thức trong đây có thể sẽ mới mẻ, cũng có thể sẽ đơn giản đối với một số người đã trải qua. Vậy hãy cùng mình học tập, giúp đỡ và chia sẻ đến những người có cùng đam mê, sở thích về phát triển ứng dụng nhé. 

[toc]

Tại sao lại có loạt bài này

Mình nhận thấy Kotlin là 1 ngôn ngữ cực kỳ hay và thú vị. Giữa hàng trăm hàng nghìn bài hướng dẫn về lập trình Android ngoài kia, mình chưa tìm ra 1 loạt bài nào giới thiệu bài bản, có lộ trình và dễ hiểu để cho người mới có thể nắm bắt. Có thể có những bài hướng dẫn về lập trình Android sử dụng Kotlin, nhưng rất ít bài hướng dẫn về những điều cốt lõi của ngôn ngữ này. Thế nên mình quyết định tạo ra loạt bài viết Hướng dẫn ngôn ngữ lập trình Kotlin. Loạt bài này sẽ đảm bảo cho bạn những kiến thức cốt lõi, quan trọng nhất để bạn có thể sử dụng trong phát triển ứng dụng Android nói riêng và các nền tảng khác nói chung. Và nó cũng hướng cho bạn cách học và cách đào sâu nghiên cứu, mở rộng cho ngôn ngữ này. So, let’s start!!!

Loạt bài này hướng đến ai

  • Nó hướng đến những người phát triển ứng dụng Android, muốn “chuyển giao công nghệ” từ Java sang Kotlin.
  • Hướng đến những bạn muốn học lập trình Android, mà chưa cả biết Java là gì. Yes!!! Các bạn có thể nhảy ngay vào Kotlin, hoàn toàn không có trở ngại gì cả.
  • Hướng đến … mình. Mình thực sự thích viết, đó là sở thích lớn của mình, chưa kể viết sẽ làm mình trau dồi thêm đc kha khá kiến thức, hehe :))

Nội dung của loạt bài hướng dẫn ngôn ngữ lập trình Kotlin

  • 15 bài hướng dẫn cover toàn bộ kiến thức cốt lõi của ngôn ngữ lập trình Kotlin, giúp bạn có đủ kiến thức để bay vào dự án thực tế 1 cách tự tin và dễ dàng. Vì chỉ có 15 bài thôi nên mỗi  bài sẽ có độ dài tương đối, các bạn hãy chịu khó theo dõi nhé.
  • Do bài viết hướng đến cả những người mới bắt đầu, nên đôi chỗ có thể giải thích hơi kỹ càng quá (đối với những người đã là dev có kinh nghiệm), nên chỗ nào các bạn thấy dễ quá, hay dài vl, thì xin các bạn đừng ném gạch, mà hãy next qua phần tiếp theo :)) Thanks
  • Loạt bài này được viết theo ngôn ngữ… đời sống. Tức là mình sẽ cố diễn giải vấn đề theo cách dân dã nhất, dễ hiểu nhất, chứ không sử dụng nhiều những từ ngữ mang tính học thuật, sẽ rất khó khăn cho ai mới tiếp xúc.
  • Phần sugguest, định hướng để các bạn tìm tòi thêm những kiến thức mới, nâng cao hơn, phục vụ cho dự án sau này.

 

Cách theo dõi loạt bài Kotlin sao cho hiệu quả nhất

Hãy cài IntelliJ IDEA

Như đã nói lúc đầu, bài viết này mình sẽ tập trung vào cốt lõi của ngôn ngữ Kotlin, và chỉ Kotlin mà thôi, không Android, không gì khác. Mình sẽ có riêng 1 loạt bài về hướng dẫn lập trình Android bằng Kotlin để vận dụng kiến thức thu được từ loạt bài này. Vì vậy ở trong những bài hướng dẫn của loạt bài này, mình sẽ không dùng Android Studio để hướng dẫn, mà thay vào đó sẽ dùng IntelliJ IDEA để code các demo. Tại sao? Bởi dùng Android Studio thì mình chỉ có thể tạo các dự án Android. Mà cứ mỗi lần muốn xem kết quả của 1 đoạn code, ta lại phải build nguyên 1 … con app! Rất mất thời gian.

Vì thế để đơn giản hóa mình sẽ sử dụng IntelliJ IDEA. IDE này cho phép ta tạo ra các project Kotlin. Đại khái là ta có thể dùng nó để xem kết quả của các đoạn code nhanh gọn đơn giản hơn, thay vì build nguyên 1 cái app. Các bạn hãy yên tâm vì nếu các bạn đã quen dùng AndroidStudio thì IntelliJ IDEA cũng có cách sử dụng hoàn toàn tương tự, giống đến 90%. Vì AS cũng build từ IntelliJ IDEA mà ra thôi. Nếu các bạn chưa biết cách cài đặt IDE này, hãy tham khảo bài viết Hướng dẫn cài đặt IntelliJ IDEA của mình nhé.

Hãy đọc thật kỹ 

Mình sẽ viết rất kỹ, rất kỹ về từng vấn đề dù là nhỏ nhất. Vì vậy mỗi bài viết có thể khá dài. Tuy nhiên  mình mong các bạn đừng bỏ qua chữ nào, bởi đằng sau mỗi đoạn text miên man đó là các kiến thức cốt lõi được diễn giải ra theo 1 cách dễ hiểu nhất (đối với những người mới). Nếu bạn đọc lướt qua, có thể bạn sẽ bỏ qua mất 1 phần kiến thức sâu hơn, nâng cao hơn mà mình muốn truyền đạt cho các bạn.

Hãy ứng dụng

Mặc dù đây mới chỉ là loạt bài giới thiệu về ngôn ngữ lập trình Kotlin, chúng ta sẽ không xây dựng app trong loạt bài này. Tuy nhiên mình muốn các bạn hãy lập tức ứng dụng những gì học được ngay khi đọc các bài viết. Hãy mở IDE lên và sẵn sàng gõ code. Chỉ có cách code thật nhiều mới có thể giúp chúng ta làm quen với 1 ngôn ngữ mới. Mình cũng xin báo trước rằng mình sẽ sử dụng rất, rất nhiều code để demo. Bởi theo mình nghĩ đó là cách đơn giản nhất giúp các bạn nhanh chóng hiểu được kiến thức. Các bạn cũng hãy tự xây dựng cho mình những đoạn code demo để ứng dụng kiến thức đã học nhé. Sẽ rất hiệu quả đấy!

Hãy chia sẻ

Hãy chia sẻ loạt bài đến những người mới bắt đầu. Những ai còn đang hoang mang giữa vô vàn kiến thức cả tiếng Anh lẫn tiếng Việt ngoài kia. Họ cần 1 lộ trình rõ ràng để làm mục tiêu học tập. Dù đã kiểm tra rất kỹ nhưng có thể ở đâu đó trong các bài viết, mình có sai sót. Hãy đọc và nếu thấy có sơ suất ở đâu, comment cho mình biết để mình cập nhật lại, để nội dung truyền tải được tốt hơn. Hãy cho đi, để được nhận lại.

Bắt đầu

Có thể các bạn sẽ tự hỏi rằng

  • Java ổn rồi ,cần thêm cái thứ Kotlin đó làm chi.
  • Thứ mới ra đó (Kotlin) chắc gì đã ổn định, Java thì best rồi, chả cần thiết phải mò vào Kotlin
  • Tao thích code Java, tao đã quen với nó, tao ghét tất cả mọi thứ khác!
  • Vân vân

Thì đúng, mình không phủ nhận những điều mà các bạn nghĩ ở trong đầu. Nhưng các bạn hãy thử nhìn vào những điểm tốt của Kotlin so với Java, rồi các bạn sẽ thấy, mình có lý do khi viết loạt bài hướng dẫn này.

Sự ngắn gọn

So với Java, Kotlin là vô cùng, vô cùng ngắn gọn. Bạn có thể hình dung, khi mà việc định nghĩa 1 class trong Java có thể tốn đến vài chục dòng hay cả trăm dòng code thì với Kotlin, ta chỉ tốn 1 dòng để làm điều tương tự. Mình sẽ ví dụ ngay đây. Sau đây sẽ là 1 class trong Java:

public class User {
   String name;
   int age;
   String address;
   String phoneNumber;

   public User(String name, int age, String address, String phoneNumber) {
       this.name = name;
       this.age = age;
       this.address = address;
       this.phoneNumber = phoneNumber;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public String getAddress() {
       return address;
   }

   public void setAddress(String address) {
       this.address = address;
   }

   public String getPhoneNumber() {
       return phoneNumber;
   }

   public void setPhoneNumber(String phoneNumber) {
       this.phoneNumber = phoneNumber;
   }
}

Trên đây là 1 class với 4 thuộc tính, hàm khởi tạo và các phương thức get, set cho các thuộc tính. Trong Kotlin nó sẽ như thế này:

data class User(var name:String,var age: Int,var address:String,var phoneNumber:String)

Vỏn vẹn 1 dòng duy nhất! Đó chính là sự khác biệt về sự ngắn gọn của Kotlin. Đây chỉ là 1 ví dụ. Trong các dự án thực tế ta sẽ còn gặp hàng trăm tình huống mà nếu sử dụng Kotlin, số dòng code phải viết có thể giảm đi đến 90%. Rất tuyệt đúng không. (mình sẽ viết những loạt bài về xây dựng các ứng dụng với quy trình như trong thực tế)

An toàn hơn với các đối tượng null

Như các bạn đã biết thì NullPointerException là 1 lỗi hay gặp nhất ở trong các dự án viết bằng Java. Java cho phép chúng ta gán giá trị null đến 1 đối tượng, nhưng khi ta truy xuất đến đối tượng đó, lỗi NullPointerException sẽ được bắn ra. Mình đã từng làm 1 dự án Android, khi update version mới cho app, mình đã quên không cập nhật đối tượng Java theo config mới trên server. Và kết quả là trong 2 ngày đã có hơn 5000 log crash được báo về hệ thống, tất cả đều là NullPointerException gây ra, bạn có thể hiểu được cảm giác thốn đến thế nào, khi có đến 95% người dùng app bị crash :-s Yeah, và Kotlin được thiết kế để giảm thiểu tối đa sự xuất hiện của cái Exception khốn nạn này 😀 Cực an toàn và tiện lợi, mình sẽ có riêng 1 bài về vấn đề này, các bạn hãy đón chờ nghe.

Hoàn toàn tương thích với Java

Yes! Bạn có thể làm 1 dự án với cả Java và Kotlin cùng 1 lúc. Kotlin được thiết kế để giao tiếp với Java 1 cách hoàn hảo. Bạn có thể sử dụng Java class trong Kotlin và ngược lại, cũng có thể sử dụng Kotlin class trong Java. Tuyệt đúng ko? Điều này có nghĩa là Kotlin có thể sử dụng tất cả các thư viện và framework Java hiện có. Điều này cũng có nghĩa là nếu bạn thích, bạn có thể mở rộng, phát triển dự án Java cũ với Kotlin rất dễ dàng.

Trên đây chỉ là 3 trong số rất nhiều điều hay và thú vị khác của Kotlin mà Java không có. Hãy cùng mình tìm hiểu kỹ hơn trong các bài viết loạt bài này nhé.