Học ngôn ngữ lập trình Kotlin: Học nhanh và hiệu quả

Published by

Kotlin là ngôn ngữ lập trình được sử dụng rộng rãi bởi các nhà phát triển Android ở mọi lĩnh vực. Trong bài viết này, chúng ta sẽ khám phá một số khía cạnh cơ bản về Kotlin để bạn có thể nhanh chóng tiếp cận và sử dụng ngôn ngữ này.

Khai báo biến

Trước tiên, chúng ta cần biết cách khai báo biến trong Kotlin. Kotlin sử dụng hai từ khoá để khai báo biến: valvar.

  • Sử dụng val cho biến có giá trị không thay đổi. Bạn không thể gán lại giá trị cho biến đã khai báo bằng val.
  • Sử dụng var cho biến có giá trị có thể thay đổi.

Ví dụ, để khai báo một biến count thuộc loại Int có giá trị ban đầu là 10, bạn có thể sử dụng cú pháp sau:

var count: Int = 10

Ngôn ngữ Kotlin cung cấp nhiều loại dữ liệu của số, như Byte, Short, Long, FloatDouble. Bạn có thể lựa chọn loại dữ liệu phù hợp với nhu cầu của mình.

Nếu bạn muốn biết biến có thể thay đổi hay không, hãy sử dụng từ khoá var hoặc val tùy thuộc vào trường hợp. Nếu biến cần có khả năng thay đổi giá trị, hãy sử dụng var. Nếu không, hãy sử dụng val.

Suy luận loại dữ liệu

Kotlin có khả năng suy ra loại dữ liệu dựa trên loại giá trị được chỉ định. Ví dụ, nếu bạn gán giá trị "Kotlin" cho biến languageName, trình biên dịch Kotlin sẽ suy ra languageName cũng là một chuỗi (String). Điều này giúp mã của bạn ngắn gọn và an toàn với loại dữ liệu.

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()

Trong ví dụ trên, toUpperCase() là một phương thức chỉ có thể được gọi trên chuỗi (String). Vì Kotlin đã suy ra languageName là chuỗi (String), bạn có thể gọi phương thức này một cách an toàn.

Kiểm tra an toàn của giá trị rỗng

Trong Kotlin, biến mặc định không thể chứa giá trị rỗng. Để cho phép giá trị rỗng, bạn có thể khai báo biến với khả năng chứa giá trị rỗng (nullable). Để làm điều này, hãy thêm dấu ? vào sau loại dữ liệu của biến. Ví dụ:

val languageName: String? = null

Với loại String?, bạn có thể gán giá trị String hoặc null cho languageName. Tuy nhiên, bạn cần phải xử lý cẩn thận các biến có khả năng chứa giá trị rỗng để tránh lỗi NullPointerException.

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

Trong Kotlin, bạn có thể triển khai logic có điều kiện bằng nhiều cách khác nhau. Cách phổ biến nhất là câu lệnh if-else. Nếu một biểu thức được bao quanh bởi dấu ngoặc vuông bên cạnh từ khoá if có giá trị là true, mã trong nhánh đó sẽ được thực thi. Nếu không, mã trong nhánh else sẽ được thực thi.

if (count == 42) {
  println("Tôi có câu trả lời.")
} else {
  println("Câu trả lời thoáng qua tôi.")
}

Bạn cũng có thể biểu thị nhiều điều kiện bằng cách sử dụng else if. Cách này cho phép bạn biểu thị logic chi tiết và phức tạp hơn trong một câu lệnh có điều kiện đơn, ví dụ:

if (count == 42) {
  println("Tôi có câu trả lời.")
} else if (count > 35) {
  println("Câu trả lời gần đây.")
} else {
  println("Câu trả lời thoáng qua tôi.")
}

Để tránh lặp lại mã, Kotlin cung cấp biểu thức có điều kiện. Bạn có thể viết lại ví dụ trên như sau:

val answerString: String = if (count == 42) {
  "Tôi có câu trả lời."
} else if (count > 35) {
  "Câu trả lời gần đây."
} else {
  "Câu trả lời thoáng qua tôi."
}

Mỗi nhánh có điều kiện sẽ ngầm trả về kết quả của biểu thức cuối cùng, vì vậy bạn không cần sử dụng từ khoá return. Với cùng loại dữ liệu trả về, kết quả của biểu thức if-else cũng thuộc cùng loại dữ liệu đó. Trong ví dụ này, answerString được gán giá trị từ biểu thức if-else. Bạn có thể loại bỏ khai báo rõ ràng của loại của answerString, nhưng nên làm điều đó để làm rõ ràng.

Lưu ý: Kotlin không bao gồm toán tử ba ngôi truyền thống, thay vào đó Kotlin ưu tiên sử dụng biểu thức có điều kiện.

Hàm

Trong Kotlin, bạn có thể nhóm một hoặc nhiều biểu thức vào một hàm để tái sử dụng. Để khai báo một hàm, sử dụng từ khoá fun trước tên hàm. Tiếp theo, xác định loại dữ liệu đầu vào (nếu có) và loại dữ liệu đầu ra của hàm. Phần thân của hàm là nơi bạn xác định các biểu thức sẽ được thực hiện khi hàm được gọi.

Dựa trên ví dụ trước, dưới đây là một hàm Kotlin hoàn chỉnh:

fun generateAnswerString(): String {
  val answerString = if (count == 42) {
    "Tôi có câu trả lời."
  } else {
    "Câu trả lời thoáng qua tôi."
  }
  return answerString
}

Trong ví dụ này, hàm generateAnswerString không lấy đối số nào. Hàm này trả về một giá trị thuộc loại String. Để gọi một hàm, sử dụng tên của hàm đó, sau đó là toán tử () để kích hoạt hàm. Trong ví dụ sau, biến answerString được khởi tạo từ kết quả của generateAnswerString().

val answerString = generateAnswerString()

Hàm có thể lấy đối số làm dữ liệu đầu vào, ví dụ:

fun generateAnswerString(countThreshold: Int): String {
  val answerString = if (count > countThreshold) {
    "Tôi có câu trả lời."
  } else {
    "Câu trả lời thoáng qua tôi."
  }
  return answerString
}

Khi khai báo một hàm, bạn có thể chỉ định số lượng và loại đối số tùy ý. Trong ví dụ trên, generateAnswerString() lấy một đối số có tên là countThreshold thuộc loại Int. Trong hàm, bạn có thể tham chiếu đến đối số bằng cách sử dụng tên của đối số đó.

Khi gọi hàm này, bạn cần cung cấp một đối số nằm trong dấu ngoặc đơn của lệnh gọi hàm:

val answerString = generateAnswerString(42)

Hàm ẩn danh

Đôi khi, không cần đặt tên cho một hàm. Những hàm này được gọi là hàm ẩn danh. Bạn có thể giữ lại tham chiếu đến một hàm ẩn danh và gọi lại hàm đó sau này. Bạn cũng có thể truyền tham chiếu này trong ứng dụng của mình.

val stringLengthFunc: (String) -> Int = { input -> input.length }

Giống như các hàm có tên, hàm ẩn danh có thể có nhiều biểu thức. Giá trị trả về của hàm là kết quả của biểu thức cuối cùng.

Trong ví dụ trên, stringLengthFunc chứa tham chiếu đến một hàm ẩn danh. Hàm ẩn danh này lấy đầu vào là chuỗi (String) và trả về độ dài của chuỗi đó dưới dạng số nguyên (Int). Vì vậy, loại hàm được biểu thị là (String) -> Int. Tuy nhiên, mã này không kích hoạt hàm. Để truy cập kết quả của hàm, bạn cần kích hoạt hàm này như cách bạn làm với hàm có tên. Bạn cần cung cấp chuỗi khi gọi stringLengthFunc, ví dụ:

val stringLengthFunc: (String) -> Int = { input -> input.length }
val stringLength: Int = stringLengthFunc("Android")

Hàm bậc cao

Một hàm có thể nhận một hàm khác làm đối số. Các hàm sử dụng các hàm khác làm đối số được gọi là hàm bậc cao. Điều này rất hữu ích trong việc giao tiếp giữa các thành phần, giống như cách bạn sử dụng giao diện gọi lại trong Java.

Dưới đây là ví dụ về một hàm bậc cao:

fun stringMapper(str: String, mapper: (String) -> Int): Int {
  // Thực thi hàm
  return mapper(str)
}

stringMapper nhận một đối số là chuỗi (String) cùng với một hàm lấy một giá trị số nguyên (Int) từ chuỗi. Bạn có thể gọi stringMapper bằng cách truyền chuỗi và một hàm thoả mãn thông số đầu vào còn lại, tức là một hàm lấy chuỗi làm đầu vào và trả về số nguyên:

stringMapper("Android", { input -> input.length })

Nếu hàm ẩn danh là tham số cuối được xác định trong một hàm, bạn có thể truyền hàm đó bên ngoài dấu ngoặc đơn sử dụng để kích hoạt hàm, như sau:

stringMapper("Android") { input -> input.length }

Hàm ẩn danh có sẵn trong thư viện Kotlin. Điều này cho phép bạn sử dụng các hàm ẩn danh trong ứng dụng của mình.

Lớp

Kotlin cho phép bạn xác định các loại dữ liệu của riêng mình bằng cách sử dụng từ khoá class.

Để khai báo một lớp, sử dụng từ khoá class như ví dụ sau:

class Car

Thuộc tính

Lớp biểu thị trạng thái bằng thuộc tính. Mỗi thuộc tính là một biến ở mức lớp, nó có thể bao gồm một phương thức getter, setter và trường dự phòng. Ví dụ, để thêm danh sách các đối tượng Wheel như một thuộc tính của Car, bạn có thể sử dụng cú pháp sau:

class Car {
  val wheels = listOf<Wheel>()
}

Lưu ý rằng wheelsval công khai, có nghĩa là bạn có thể truy cập vào wheels từ bên ngoài lớp Car và không thể chỉ định lại thuộc tính này. Để có một thực thể của Car, bạn cần gọi hàm tạo của thực thể đó. Sau đó, bạn có thể truy cập các thuộc tính cho phép truy cập.

val car = Car() // tạo một thực thể Car
val wheels = car.wheels // nhận giá trị "wheels" từ Car

Nếu bạn muốn điều chỉnh bánh xe của mình, bạn có thể xác định một hàm tạo tùy chỉnh để chỉ định cách khởi tạo các thuộc tính trong lớp:

class Car(val wheels: List<Wheel>)

Trong ví dụ trên, hàm tạo lớp nhận List<Wheel> làm đối số hàm tạo và sử dụng đối số đó để khởi tạo thuộc tính wheels.

Hàm trong lớp và đóng gói lớp

Lớp sử dụng hàm để xây dựng mô hình hành vi. Hàm có thể sửa đổi trạng thái, giúp bạn chỉ cung cấp dữ liệu mà bạn muốn cung cấp. Quyền truy cập này thuộc về khái niệm rộng hơn về đóng gói trong lập trình hướng đối tượng.

Trong ví dụ sau, thuộc tính doorLock được đặt ở chế độ riêng tư, tách khỏi bất kỳ nội dung bên ngoài lớp Car. Để mở khóa cửa xe, bạn cần gọi hàm unlockDoor(), hàm này truyền một chiếc chìa khóa hợp lệ, ví dụ:

class Car(val wheels: List<Wheel>) {
  private val doorLock: DoorLock = ...

  fun unlockDoor(key: Key): Boolean {
    // Trả về true nếu chìa khóa hợp lệ cho khóa cửa, ngược lại trả về false
  }
}

Nếu bạn muốn tùy chỉnh cách tham chiếu một thuộc tính, bạn có thể cung cấp phương thức getter và setter tùy chỉnh. Ví dụ: để cung cấp phương thức getter của một thuộc tính và hạn chế quyền truy cập vào phương thức setter của thuộc tính đó, bạn có thể xác định phương thức setter là private:

class Car(val wheels: List<Wheel>) {
  private val doorLock: DoorLock = ...
  var gallonsOfFuelInTank: Int = 15
    private set

  fun unlockDoor(key: Key): Boolean {
    // Trả về true nếu chìa khóa hợp lệ cho khóa cửa, ngược lại trả về false
  }
}

Với sự kết hợp giữa thuộc tính và hàm, bạn có thể xây dựng lớp để tạo ra mô hình cho tất cả các loại đối tượng.

Khả năng tương thích

Một trong những tính năng quan trọng của Kotlin là khả năng tương tác linh hoạt với Java. Vì mã Kotlin được biên dịch thành mã byte VM, mã Kotlin của bạn có thể gọi trực tiếp vào mã Java và ngược lại. Điều này có nghĩa là bạn có thể sử dụng các thư viện Java hiện có ngay trên Kotlin. Ngoài ra, phần lớn API của Android được viết bằng Java và bạn có thể gọi các API đó trực tiếp trên Kotlin.

Các bước tiếp theo

Kotlin là một ngôn ngữ linh hoạt và thực tế với khả năng hỗ trợ và xu hướng phát triển ngày càng tăng. Nếu bạn chưa bao giờ sử dụng Kotlin, hãy thử ngay. Để tìm hiểu thêm về các bước tiếp theo, hãy xem tài liệu chính thức về Kotlin và hướng dẫn cách áp dụng các mẫu Kotlin phổ biến trong ứng dụng Android của bạn.

This post was last modified on Tháng Năm 8, 2024 8:56 chiều

Đinh Thái Hoàng

Đinh Thái Hoàng - tác giả của Laptrinhc.edu.vn, chuyên sâu trong lĩnh vực lập trình. Trang web chia sẻ kiến thức, hướng dẫn và tin tức về lập trình, giúp bạn khám phá thế giới mã nguồn và nâng cao kỹ năng coder.

Published by

Bài đăng mới nhất

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

Khám phá và tận dụng tiềm năng kinh doanh trên nhiều nền tảng là điều…

6 ngày ago

HỌC THIẾT KẾ MOBILE APP Ở ĐÂU UY TÍN?

Mobile App đang trở thành một phần thiết yếu trong cuộc sống hiện đại. Với…

6 ngày ago

Cách phá mật khẩu Windows bằng DLC Boot

Bạn đã bao giờ quên mật khẩu máy tính và không biết phải làm sao?…

6 ngày ago

Cách kiểm tra và cài đặt Driver cho Windows 10 chuẩn nhất

Driver chính là phần mềm giúp hệ điều hành nhận diện phần cứng trên máy…

6 ngày ago

Top 10 công cụ viết phần mềm tốt nhất

Hiện nay, lập trình viên không cần phải thực hiện toàn bộ công việc lập…

6 ngày ago

Những Công Ty Lập Trình Ứng Dụng Cho IOS Hàng Đầu Việt Nam

Lập trình ứng dụng cho iOS không chỉ đơn thuần là một quyết định khó…

6 ngày ago