Sử dụng thuộc tính rỗng trong Kotlin

1. Trước khi bắt đầu

Lớp học lập trình này hướng dẫn bạn về thuộc tính rỗng (nullability) và tầm quan trọng của sự an toàn null. Thuộc tính rỗng là một khái niệm thường thấy trong nhiều ngôn ngữ lập trình. Nó đề cập đến khả năng các biến không có giá trị. Trong Kotlin, thuộc tính rỗng được xử lý một cách có chủ ý để đạt được độ an toàn null.

Điều kiện tiên quyết

  • Kiến thức cơ bản về lập trình Kotlin, bao gồm các biến cũng như các hàm println()main()
  • Nắm rõ các câu lệnh có điều kiện trong Kotlin, trong đó có các câu lệnh if/else và biểu thức Boolean
  • Kiến thức về các lớp trong Kotlin, bao gồm cách truy cập vào các phương thức và thuộc tính của một biến.

Kiến thức bạn sẽ học được

  • null là gì?
  • Sự khác biệt giữa các loại biến rỗng và không rỗng
  • Mức độ an toàn của null là gì, tầm quan trọng của nó và cách Kotlin đạt được độ an toàn null.
  • Cách truy cập vào các phương thức và thuộc tính của biến rỗng bằng toán tử lệnh gọi an toàn ?. và toán tử xác nhận giá trị không rỗng !!.
  • Cách thực hiện các hoạt động kiểm tra null bằng lệnh điều kiện if/else.
  • Cách chuyển đổi một biến rỗng thành không rỗng bằng biểu thức if/else.
  • Cách cung cấp giá trị mặc định khi biến có giá trị rỗng là null bằng biểu thức if/else hoặc toán tử Elvis ?:.

Bạn cần có

  • Một trình duyệt web có quyền truy cập vào Kotlin Playground

2. Dùng các biến rỗng

null là gì?

Trong Bài 1, bạn đã được học khi khai báo một biến, bạn cần chỉ định ngay giá trị cho biến đó. Ví dụ: khi khai báo một biến favoriteActor, bạn có thể chỉ định ngay giá trị chuỗi "Sandra Oh" cho biến đó.

val favoriteActor = "Sandra Oh"

Một hộp đại diện cho biến favoriteActor được gán giá trị chuỗi "Sandra Oh".

Tuy nhiên, nếu bạn không có diễn viên yêu thích thì sao? Bạn nên chỉ định cho biến một giá trị "Nobody" hoặc "None". Đây không phải là phương pháp hay vì lập trình của bạn diễn giải biến favoriteActor có giá trị "Nobody" hoặc "None" thay vì không có giá trị. Trong Kotlin, bạn có thể dùng null để cho biết không có giá trị nào liên kết với biến.

Hộp đại diện cho biến afavoriteActor đã chỉ định một giá trị rỗng.

Để sử dụng null trong mã, hãy làm theo các bước sau:

  1. Trong Kotlin Playground, hãy thay thế nội dung trong phần nội dung của hàm main() bằng một biến favoriteActor đã đặt thành null:
fun main() {
    val favoriteActor = null
}
  1. In giá trị của biến favoriteActor bằng hàm println() rồi chạy lập trình này:
fun main() {
    val favoriteActor = null
    println(favoriteActor)
}

Kết quả sẽ có dạng như đoạn mã này:

null

Chỉ định lại biến bằng null

Trước đây, bạn đã được học là có thể chỉ định lại các biến được xác định bằng từ khóa var cho các giá trị khác nhau cùng loại. Ví dụ: bạn có thể chỉ định lại một biến name được khai báo bằng một tên cho tên khác, miễn là tên mới thuộc loại String.

var favoriteActor: String = "Sandra Oh"
favoriteActor = "Meryl Streep"

Đôi khi sau khi khai báo một biến, bạn có thể chỉ định biến đó cho null. Ví dụ: sau khi khai báo diễn viên yêu thích, bạn quyết định không muốn tiết lộ diễn viên mình yêu thích. Trong trường hợp này, bạn nên chỉ định biến favoriteActor cho null.

Hiểu về các biến không rỗng và biến rỗng

Để chỉ định lại biến favoriteActor cho null, hãy làm theo các bước sau:

  1. Thay đổi từ khóa val thành từ khóa var và sau đó chỉ định biến favoriteActor là một loại String và chỉ định biến đó cho tên của diễn viên bạn yêu thích:
fun main() {
    var favoriteActor: String = "Sandra Oh"
    println(favoriteActor)
}
  1. Xóa hàm println():
fun main() {
    var favoriteActor: String = "Sandra Oh"
}
  1. Chỉ định lại biến favoriteActor cho null rồi chạy lập trình này:
fun main() {
    var favoriteActor: String = "Sandra Oh"
    favoriteActor = null
}

Bạn sẽ nhận được thông báo lỗi sau:

Một thông báo cảnh báo có nội dung: "Rỗng không thể là một giá trị của một chuỗi loại không rỗng.

Trong Kotlin, có sự khác biệt giữa các loại giá trị rỗng và không rỗng:

  • Loại có giá trị rỗng là các biến có thể lưu giữ dữ liệu null.
  • Loại không có giá trị rỗng là các biến không thể lưu giữ dữ liệu null.

Một loại chỉ có thể rỗng nếu bạn cho phép lưu giữ dữ liệu null một cách rõ ràng. Như thông báo lỗi hiển thị ở trên, loại dữ liệu String là loại không rỗng, do đó, bạn không thể chỉ định lại biến đó thành null.

Sơ đồ hướng dẫn cách khai báo các biến rỗng. Giá trị này bắt đầu bằng một từ khóa var theo sau là ô tên của biến, dấu chấm phẩy, loại biến, dấu chấm hỏi, dấu bằng và ô giá trị.  Ô loại và dấu chấm hỏi được biểu thị bằng dòng chữ loại giá trị Rỗng để đánh dấu loại theo sau là dấu chấm hỏi, là dấu hiệu cho thấy đó là loại có giá trị rỗng.

Để khai báo biến rỗng trong Kotlin, bạn cần thêm một toán tử ? vào cuối loại biến đó. Ví dụ: loại String? có thể chứa một chuỗi hoặc null, trong khi loại String chỉ có thể chứa một chuỗi. Để khai báo một biến rỗng, bạn cần thêm loại rỗng một cách rõ ràng. Nếu không có loại rỗng, trình biên dịch Kotlin sẽ tự cho đó là loại không rỗng

  1. Thay đổi loại biến favoriteActor từ loại dữ liệu String thành loại dữ liệu String?:
fun main() {
    var favoriteActor: String? = "Sandra Oh"
    favoriteActor = null
}
  1. In biến favoriteActor trước và sau khi chỉ định lại null, rồi chạy lập trình này:
fun main() {
    var favoriteActor: String? = "Sandra Oh"
    println(favoriteActor)

    favoriteActor = null
    println(favoriteActor)
}

Kết quả sẽ có dạng như đoạn mã này:

Sandra Oh
null

Biến favoriteActor ban đầu đã giữ lại một chuỗi và sau đó nó được chuyển đổi thành null.

Thử nào

Bây giờ, bạn đã có thể sử dụng loại String? rỗng, bạn có thể khởi tạo biến có giá trị Int và chỉ định lại biến đó thành null hay không?

Viết một giá trị Int rỗng

  1. Xóa tất cả mã trong hàm main():
fun main() {

}
  1. Tạo biến number thuộc loại Int rỗng rồi chỉ định giá trị 10 cho biến đó:
fun main() {
    var number: Int? = 10
}
  1. In biến number rồi chạy lập trình:
fun main() {
    var number: Int? = 10
    println(number)
}

Kết quả như mong đợi:

10
  1. Chỉ định lại biến number cho null để xác nhận biến đó là rỗng:
fun main() {
    var number: Int? = 10
    println(number)

    number = null
}
  1. Thêm một câu lệnh println(number) khác làm dòng lệnh cuối của lập trình rồi chạy lập trình đó:
fun main() {
    var number: Int? = 10
    println(number)

    number = null
    println(number)
}

Kết quả như mong đợi:

10
null

3. Xử lý các biến rỗng

Trước đây, bạn đã học cách dùng toán tử . để truy cập vào các phương thức và thuộc tính của biến không rỗng. Trong phần này, bạn sẽ tìm hiểu cách sử dụng nó để truy cập vào các phương thức và thuộc tính của biến rỗng.

Để truy cập vào một thuộc tính của biến favoriteActor không rỗng, hãy làm theo các bước sau:

  1. Xóa toàn bộ mã trong hàm main() rồi khai báo một biến favoriteActor thuộc loại String và chỉ định nó cho tên của diễn viên bạn yêu thích:
fun main() {
    var favoriteActor: String = "Sandra Oh"
}
  1. In số lượng ký tự trong giá trị biến favoriteActor bằng thuộc tính length rồi chạy lập trình này:
fun main() {
    var favoriteActor: String = "Sandra Oh"
    println(favoriteActor.length)
}

Kết quả như mong đợi:

9

chín ký tự trong giá trị của biến favoriteActor, bao gồm cả dấu cách. Số lượng ký tự của tên diễn viên bạn yêu thích có thể khác.

Truy cập vào một thuộc tính của một biến rỗng

Hãy tưởng tượng bạn muốn đặt biến favoriteActor thành rỗng để những người không có diễn viên yêu thích nào có thể chỉ định biến đó cho null.

Để truy cập vào một thuộc tính của biến favoriteActor rỗng, hãy làm theo các bước sau:

  • Hãy thay đổi loại biến favoriteActor thành loại giá trị rỗng rồi chạy lập trình này:
fun main() {
    var favoriteActor: String? = "Sandra Oh"
    println(favoriteActor.length)
}

Bạn sẽ nhận được thông báo lỗi sau:

Một thông báo lỗi có nội dung: "Chỉ cho phép xác nhận lệnh gọi an toàn hoặc không rỗng trên trình nhận giá trị rỗng của loại Chuỗi.

Lỗi này là một lỗi biên dịch. Như đã đề cập trong một lớp học lập trình trước, lỗi biên dịch xảy ra khi Kotlin không thể biên dịch mã do lỗi cú pháp trong mã.

Kotlin có chủ ý áp dụng các quy tắc cú pháp để có thể đạt được độ an toàn null, nghĩa là đảm bảo không có lệnh gọi vô ý nào được thực hiện trên biếnnull. Điều này không có nghĩa là các biến không thể null. Nó có nghĩa là nếu thành viên của một biến được truy cập, thì biến đó không thể là null.

Điều này rất quan trọng vì nếu có sự cố truy cập vào một thành viên của biến null – còn gọi lànull tham chiếu - khi ứng dụng đang chạy, ứng dụng sẽ gặp sự cố do biến null không chứa bất kỳ thuộc tính hoặc phương thức nào. Loại sự cố này được gọi là lỗi thời gian chạy, trong đó lỗi xảy ra sau khi mã đã biên dịch và chạy.

Do tính chất an toàn null trong Kotlin, các lỗi thời gian chạy này sẽ bị ngăn chặn do trình biên dịch Kotlin buộcnull kiểm tra đối với các loại rỗng. kiểm tra Null là quá trình kiểm tra xem một biến có thể là null hay không trước khi được truy cập và xử lý dưới dạng giá trị rỗng. Nếu muốn sử dụng một giá trị rỗng cho loại không có giá trị rỗng, bạn cần phải xác định rõ ràng giá trị của null. Bạn có thể tìm hiểu về vấn đề này trong phần Sử dụng câu lệnh có điều kiện if/else trong phần sau của học lập trình này.

Trong ví dụ này, mã không thành công tại thời điểm biên dịch vì nó không được phép tham chiếu trực tiếp đến thuộc tính length cho biến favoriteActor vì có khả năng biến là null.

Tiếp theo, bạn sẽ tìm hiểu các kỹ thuật và toán tử để làm việc với các loại rỗng.

Dùng toán tử an toàn cho lệnh gọi của ?.

Bạn có thể dùng toán tử an toàn cho lệnh gọi ?. để truy cập vào các phương thức hoặc thuộc tính của biến rỗng.

Sơ đồ cho thấy một khối biến rỗng, được theo sau là một dấu chấm hỏi, một dấu chấm và một khối phương thức hoặc thuộc tính. Không có dấu cách nào ở giữa.

Để sử dụng toán tử an toàn cho lệnh gọi ?. nhằm truy cập vào một phương thức hoặc thuộc tính, hãy thêm biểu tượng ? vào sau tên biến và truy cập vào phương thức hoặc thuộc tính có ký hiệu ..

Toán tử an toàn cho lệnh gọi ?. cho phép việc truy cập an toàn hơn vào các biến rỗng vì trình biên dịch Kotlin dừng mọi hoạt động truy cập của thành viên vào các tham chiếu null và trả null về cho thành viên được quyền truy cập.

Để truy cập an toàn vào một thuộc tính của biến favoriteActor rỗng, hãy làm theo các bước sau:

  1. Trong câu lệnh println(), hãy thay thế toán tử . bằng toán tử an toàn cho lệnh gọi ?.:
fun main() {
    var favoriteActor: String? = "Sandra Oh"
    println(favoriteActor?.length)
}
  1. Chạy lập trình này rồi xác minh kết quả đúng như mong đợi:
9

Số lượng ký tự của tên diễn viên yêu thích có thể khác nhau.

  1. Chỉ định lại biến favoriteActor cho null rồi chạy lập trình này:
fun main() {
    var favoriteActor: String? = null
    println(favoriteActor?.length)
}

Bạn sẽ đạt được kết quả như sau:

null

Xin lưu ý lập trình này sẽ không gặp sự cố mặc dù đã cố gắng truy cập vào thuộc tính length của một biến null. Biểu thức an toàn cho lệnh gọi trở về null.

Dùng toán tử xác nhận không rỗng !!

Bạn cũng có thể dùng toán tử xác nhận không rỗng !! để truy cập vào các phương thức hoặc thuộc tính của biến rỗng.

Sơ đồ cho thấy một khối biến rỗng, theo sau là hai dấu chấm than, một dấu chấm và một khối phương thức hoặc thuộc tính. Không có dấu cách nào ở giữa.

Sau biến rỗng, bạn cần thêm toán tử xác nhận không rỗng !! theo sau là toán tử ., sau đó là phương thức hoặc thuộc tính không có khoảng trắng.

Dựa vào tên cho ta thấy, nếu bạn sử dụng toán tử xác nhận không rỗng !!, điều đó có nghĩa là bạn xác nhận giá trị của biến không null, bất kể nó có hay không.

Không giống như toán tử an toàn cho lệnh gọi ?., việc sử dụng toán tử xác nhận không rỗng !! có thể dẫn đến lỗi NullPointerException nếu biến rỗng thực sự là null. Do đó, chỉ nên thực hiện khi biến luôn có giá trị không rỗng hoặc một xử lý ngoại lệ thích hợp đã được thiết lập. Khi không được xử lý, các trường hợp ngoại lệ có thể gây ra lỗi thời gian chạy. Bạn sẽ tìm hiểu về cách xử lý ngoại lệ trong các bài sau của khóa học.

Để truy cập vào một thuộc tính của biếnfavoriteActor biến bằng toán tử xác nhận không rỗng !!, hãy làm theo các bước sau:

  1. Chỉ định lại biến favoriteActor cho tên của diễn viên bạn yêu thích rồi thay thế toán tử an toàn cho lệnh gọi ?. bằng toán tử xác nhận không rỗng !! trong câu lệnh println():
fun main() {
    var favoriteActor: String? = "Sandra Oh"
    println(favoriteActor!!.length)
}
  1. Chạy lập trình này rồi xác minh kết quả đúng như mong đợi:
9

Số lượng ký tự của tên diễn viên yêu thích có thể khác nhau.

  1. Chỉ định lại biến favoriteActor cho null rồi chạy lập trình này:
fun main() {
    var favoriteActor: String? = null
    println(favoriteActor!!.length)
}

Bạn gặp phải lỗi NullPointerException:

Một thông báo lỗi có nội dung: "Trường hợp ngoại lệ trong luồng "main" java.lang.NullPointerException."

Lỗi Kotlin này cho thấy lập trình của bạn đã gặp sự cố trong quá trình thực thi. Do đó, bạn không nên dùng toán tử xác nhận không rỗng !! trừ khi bạn chắc chắn biến đó không null.

Sử dụng câu lệnh có điều kiệnif/else

Bạn có thể sử dụng nhánh if trong câu lệnh có điều kiện if/else để thực hiện kiểm tranull.

Sơ đồ cho thấy một khối biến rỗng, theo sau là một dấu chấm than, một dấu bằng và giá trị rỗng.

Để thực hiện kiểm tra null, bạn có thể kiểm tra để đảm bảo biến rỗng không bằng null với toán tử so sánh !=.

Câu lệnh if/else

Bạn có thể sử dụng câu lệnh if/else cùng với việc kiểm tra null như sau:

Sơ đồ mô tả câu lệnh if/else với từ khóa if theo sau là dấu ngoặc đơn với một khối kiểm tra tính rỗng bên trong, một cặp dấu ngoặc nhọn có body 1 (thân 1) bên trong, một từ khóa else và một cặp dấu ngoặc nhọn có khối body 2 (thân 2) bên trong. Mệnh đề else được bao bọc bởi một dấu hộp nét đứt màu đỏ, được chú thích là không bắt buộc.

Bước kiểm tra tính rỗng rất hữu ích khi kết hợp với câu lệnh if/else:

  • Bước kiểm tra null của biểu thức nullableVariable != null được dùng làm câu lệnh điều kiện if.
  • Body 1 (thân 1) bên trong nhánh if giả định biến không có giá trị rỗng. Do đó, trong phần nội dung này, bạn có thể tự do truy cập vào các phương thức hoặc thuộc tính của biến như là biến không rỗng khi không cần dùng toán tử an toàn cho lệnh gọi ?. hoặc toán tử xác nhận không rỗng !!.
  • Body 2 (Thân 2) bên trong nhánh else giả định biến đó là null. Do đó, trong phần nội dung này, bạn có thể thêm câu lệnh sẽ chạy khi biến là null. Nhánh else là không bắt buộc. Bạn chỉ có thể sử dụng câu lệnh có điều kiện if để chạy kiểm tra null mà không phải cung cấp thao tác mặc định khi bước kiểm tra null không thành công.

Việc kiểm tra null thuận tiện hơn với câu lệnh điều kiện if khi có nhiều dòng mã sử dụng biến rỗng. Ngược lại, toán tử an toàn cho lệnh gọi ?. thuận tiện hơn cho việc tham chiếu duy nhất biến có tính rỗng.

Để viết một câu lệnh if/else có kiểm tra tính null cho biến favoriteActor, hãy làm theo các bước sau:

  1. Chỉ định lại biến favoriteActor theo tên của diễn viên bạn yêu thích rồi xóa câu lệnh println():
fun main() {
    var favoriteActor: String? = "Sandra Oh"

}
  1. Thêm một nhánh if có mộ câu lệnh điều kiện favoriteActor != null:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    if (favoriteActor != null) {

    }
}
  1. Trong phần nội dung của nhánh if, hãy thêm một câu lệnh println chấp nhận chuỗi "The number of characters in your favorite actor's name is ${favoriteActor.length}" rồi chạy lập trình:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    if (favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    }
}

Kết quả như mong đợi.

The number of characters in your favorite actor's name is 9.

Số lượng ký tự của tên diễn viên bạn yêu thích có thể khác.

Xin lưu ý bạn có thể truy cập vào phương thức độ dài của tên trực tiếp với toán tử . vì bạn sẽ truy cập vào phương thức length bên trong nhánh if sau quá trình kiểm tra null. Như thế, trình biên dịch Kotlin sẽ biết không có khả năng biến favoriteActornull, vì vậy nó cho phép truy cập trực tiếp vào thuộc tính.

  1. Không bắt buộc: Thêm nhánh else để xử lý trường hợp tên của diễn viên là null:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    if (favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    } else {

    }
}
  1. Trong phần nội dung của nhánh else, hãy thêm một câu lệnh println sẽ nhận chuỗi "You didn't input a name.":
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    if (favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    } else {
      println("You didn't input a name.")
    }
}
  1. Chỉ định biến favoriteActor cho null rồi chạy lập trình:
fun main() {
    var favoriteActor: String? = null

    if(favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    } else {
      println("You didn't input a name.")
    }
}

Kết quả như mong đợi:

You didn't input a name.

if/else biểu thức

Bạn cũng có thể kết hợp việc kiểm tra null với biểu thức if/else để chuyển đổi một biến rỗng thành một biến không có giá trị rỗng.

Sơ đồ mô tả biểu thức if/else với từ khóa val theo sau là khối tên, dấu hai chấm và khối loại không có thuộc tính rỗng, dấu bằng, từ khóa if, dấu ngoặc đơn có câu lệnh điều kiện bên trong, một cặp dấu ngoặc nhọn có body 1 (thân 1) bên trong, một từ khóa khác với một cặp dấu ngoặc nhọn và một khối body 2 (thân 2) bên trong.

Cách chỉ định biểu thức if/else cho một loại không rỗng:

  • Bước kiểm tra nullableVariable != null null được sử dụng làm câu lệnh điều kiện if.
  • Body 1 (thân 1) bên trong nhánh if giả định biến không có giá trị rỗng. Do đó, trong phần nội dung này, bạn có thể truy cập vào các phương thức hoặc thuộc tính của biến như đó là biến không rỗng nếu không có toán tử an toàn ?. hoặc toán tử xác nhận không rỗng.!!.
  • Body 2 (Thân 2) bên trong nhánh else giả định biến đó là null. Do đó, trong phần nội dung này, bạn có thể thêm câu lệnh sẽ chạy khi biến là null.
  • Trong dòng lệnh cuối cùng của thân 1 và 2, bạn cần sử dụng một biểu thức hoặc giá trị dẫn đến loại không rỗng để nó được gán cho biến không có tính rỗng khi bước kiểm tra null đạt hoặc không.

Để sử dụng biểu thức if/else nhằm viết lại lập trình để nó chỉ có thể sử dụng một câu lệnh println, hãy làm theo các bước sau:

  1. Chỉ định biến favoriteActor cho tên của diễn viên bạn yêu thích:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    if (favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    } else {
      println("You didn't input a name.")
    }
}
  1. Tạo biến lengthOfName rồi chỉ định biến đó cho biểu thức if/else:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    val lengthOfName = if(favoriteActor != null) {
      println("The number of characters in your favorite actor's name is ${favoriteActor.length}.")
    } else {
      println("You didn't input a name.")
    }
}
  1. Xóa cả hai câu lệnh println() khỏi nhánh ifelse:
fun main() {
    var favoriteActor: String? = "Sandra Oh"

    val lengthOfName = if(favoriteActor != null) {

    } else {

    }
}
  1. Trong phần nội dung của nhánh if, hãy thêm biểu thức favoriteActor.length:
fun main() {
    val favoriteActor: String? = "Sandra Oh"

    val lengthOfName = if(favoriteActor != null) {
      favoriteActor.length
    } else {

    }
}

Thuộc tính length của biến favoriteActor được truy cập trực tiếp bằng toán tử ..

  1. Trong phần nội dung của nhánh else, hãy thêm một giá trị 0:
fun main() {
    val favoriteActor: String? = "Sandra Oh"

    val lengthOfName = if(favoriteActor != null) {
      favoriteActor.length
    } else {
      0
    }
}

Giá trị 0 đóng vai trò là giá trị mặc định khi tên là null.

  1. Ở cuối hàm main(), hãy thêm một câu lệnh println sẽ nhận chuỗi "The number of characters in your favorite actor's name is $lengthOfName." rồi chạy lập trình:
fun main() {
    val favoriteActor: String? = "Sandra Oh"

    val lengthOfName = if(favoriteActor != null) {
      favoriteActor.length
    } else {
      0
    }

    println("The number of characters in your favorite actor's name is $lengthOfName.")
}

Kết quả như mong đợi:

The number of characters in your favorite actor's name is 9.

Số lượng ký tự của tên bạn đã sử dụng có thể khác.

Sử dụng toán tử Elvis?:

Toán tử Elvis ?: là toán tử bạn có thể sử dụng cùng với toán tử an toàn cho lệnh gọi ?.. Với toán tử Elvis ?:, bạn có thể thêm một giá trị mặc định khi toán tử an toàn cho lệnh gọi ?. trả về null. Biểu thức này tương tự như biểu thức if/else, nhưng theo cách đặc trưng hơn.

Nếu biến không phải lànull, biểu thức trước toán tử Elvis ?: sẽ thực thi. Nếu biến null, biểu thức sau toán tử Elvis ?: sẽ thực thi.

Sơ đồ hiển thị từ khóa val theo sau là khối tên, dấu bằng, khối biến có tính rỗng, dấu chấm hỏi, dấu chấm, khối phương thức hoặc thuộc tính, dấu chấm hỏi, dấu hai chấm và khối giá trị mặc định.

Để sửa đổi lập trình trước nhằm sử dụng toán tử Elvis ?:, hãy làm theo các bước sau:

  1. Xóa biến có câu lệnh có điều kiện if/else rồi đặt biến lengthOfName thành biến favoriteActor rỗng và dùng toán tử an toàn cho lệnh gọi ?. để gọi thuộc tính length:
fun main() {
    val favoriteActor: String? = "Sandra Oh"

    val lengthOfName = favoriteActor?.length

    println("The number of characters in your favorite actor's name is $lengthOfName.")
}
  1. Sau thuộc tính length, hãy thêm toán tử Elvis ?:, theo sau là giá trị 0, rồi chạy lập trình:
fun main() {
    val favoriteActor: String? = "Sandra Oh"

    val lengthOfName = favoriteActor?.length ?: 0

    println("The number of characters in your favorite actor's name is $lengthOfName.")
}

Kết quả vẫn như trước:

The number of characters in your favorite actor's name is 9.

4. Kết luận

Xin chúc mừng! Bạn đã tìm được học về thuộc tính rỗng và cách sử dụng nhiều toán tử để quản lý thuộc tính đó.

Tóm tắt

  • Bạn có thể đặt một biến thành null để cho biết biến đó không có giá trị.
  • Không thể chỉ định biến không rỗng cho null.
  • Bạn có thể chỉ định các biến rỗng cho null.
  • Để truy cập vào các phương thức hoặc thuộc tính của biến rỗng, bạn cần dùng toán tử an toàn cho lệnh gọi ?. hoặc toán tử xác nhận không rỗng !!.
  • Bạn có thể sử dụng câu lệnh if/else cùng với việc kiểm tra vinull để truy cập các biến rỗng trong ngữ cảnh không có thuộc tính rỗng.
  • Bạn có thể chuyển đổi một biến rỗng thành loại không rỗng bằng biểu thức if/else.
  • Bạn có thể cung cấp giá trị mặc định khi biến rỗng là null bằng biểu thức if/else hoặc toán tử Elvis ?:.

Tìm hiểu thêm