Tạo và sử dụng biến trong Kotlin

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

Trong các ứng dụng mà bạn sử dụng trên điện thoại, hãy lưu ý rằng một số phần của ứng dụng được giữ nguyên, trong khi các phần khác sẽ thay đổi (còn gọi là biến).

Ví dụ: tên của các danh mục trong ứng dụng Cài đặt được giữ nguyên – Mạng và Internet, Thiết bị đã kết nối, Ứng dụng và nhiều danh mục khác.

Ảnh chụp màn hình của ứng dụng Cài đặt hiển thị các tùy chọn trên trình đơn để thay đổi chế độ cài đặt của thiết bị. Các mục trong trình đơn hiển thị trên màn hình là Mạng và Internet, Thiết bị đã kết nối, Ứng dụng, Thông báo, Pin, Bộ nhớ, Âm thanh và rung, Màn hình.

Mặt khác, khi bạn xem một ứng dụng tin tức, các bài viết sẽ thay đổi thường xuyên. Tên bài viết, nguồn, thời gian đăng và hình ảnh sẽ được thay đổi.

Bạn cần viết mã như thế nào để nội dung thay đổi theo thời gian? Bạn không thể viết lại mã trong ứng dụng mỗi khi cần đăng bài viết mới. Việc đăng bài mới diễn ra mỗi ngày, mỗi giờ và mỗi phút!

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách viết mã với các biến để bạn có thể thay đổi một số phần nhất định trong chương trình mà không cần phải viết một tập lệnh hoàn toàn mới. Bạn sẽ sử dụng Kotlin Playground như trong lớp học lập trình trước.

Sản phẩm bạn sẽ tạo ra

  • Chương trình ngắn sử dụng các biến trong Kotlin.

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

  • Cách định nghĩa biến và cập nhật giá trị của biến.
  • Cách chọn kiểu dữ liệu (data type) thích hợp cho biến từ các kiểu dữ liệu cơ bản trong Kotlin.
  • Cách thêm ghi chú vào mã.

Bạn cần có

  • Máy tính có kết nối Internet và trình duyệt web

2. Biến và kiểu dữ liệu

Trong lĩnh vực lập trình máy tính có khái niệm về biến - vùng chứa dữ liệu. Bạn có thể hình dung nó là một hộp chứa giá trị. Chiếc hộp này có nhãn là tên của biến. Khi tham chiếu đến hộp này theo tên biến, bạn sẽ có quyền truy cập vào giá trị của hộp.

Sơ đồ này cho thấy cách biến giữ dữ liệu tương tự như cách hộp chứa một vật nào đó. Có một hộp có chữ name (tên) ở trên. Ngoài hộp có một nhãn ghi value (giá trị). Có một mũi tên chỉ hướng từ giá trị vào hộp, nghĩa là giá trị đó nằm bên trong hộp.

Tại sao cần lưu trữ giá trị trong một hộp và tham chiếu hộp đó theo tên, trong khi bạn có thể trực tiếp sử dụng giá trị đó? Vấn đề là khi mã sử dụng giá trị trực tiếp trong tất cả lệnh, chương trình sẽ chỉ hoạt động cho một trường hợp cụ thể đó.

Dưới đây là một ví dụ giúp bạn dễ dàng hiểu được lợi ích khi sử dụng biến. Dưới đây là bức thư dành cho một người mà bạn mới gặp.

Chào Lauren!

Rất vui được gặp bạn hôm nay tại văn phòng. Tôi rất mong được gặp bạn vào thứ Sáu.

Chúc một ngày tốt lành!

Bức thư này rất tuyệt, nhưng chỉ phù hợp với trường hợp cụ thể với Lauren. Điều gì xảy ra nếu bạn phải viết một bức thư nhiều lần, mỗi bức chỉ cần thay đổi một vài phần để gửi cho nhiều người? Sẽ hiệu quả hơn nếu bạn tạo một mẫu thư và để trống các phần có thể thay đổi.

Chào ____ !

Rất vui được gặp bạn hôm nay tại _____. Tôi rất mong được gặp bạn vào ____ .

Chúc một ngày tốt lành!

Bạn cũng có thể chỉ định kiểu thông tin được điền vào mỗi khoảng trống. Điều này đảm bảo rằng mẫu thư sẽ được sử dụng đúng như mong đợi.

Chào { tên } !

Rất vui được gặp bạn hôm nay tại { địa điểm } . Tôi rất mong được gặp bạn vào { ngày } .

Chúc một ngày tốt lành!

Về mặt lý thuyết, việc xây dựng một ứng dụng cũng tương tự như vậy. Bạn đặt phần giữ chỗ cho một số dữ liệu và giữ nguyên các phần khác của ứng dụng.

Hình minh hoạ này cho thấy một ứng dụng Tin tức mẫu. Nội dung màn hình bắt đầu bằng thông báo chào mừng, trong đó tên được để dưới dạng phần giữ chỗ cho tên thật của người dùng. Phía dưới có phần văn bản hiển thị "Latest news for you" (Tin tức mới nhất cho bạn). Phần văn bản này không thay đổi bất kể bài viết được tải trong ứng dụng. Dưới phần văn bản này có các hàng cho bài viết mới, trong đó có phần giữ chỗ cho hình ảnh, tên, ngày và nguồn của bài viết. Ở cuối danh sách bài viết là nút có nội dung "View more articles" (Xem thêm tin tức).

Trong hình minh hoạ trên của ứng dụng tin tức, văn bản "Welcome", tiêu đề "Latest news for you" và văn bản của nút "View more articles" luôn giữ nguyên. Ngược lại, tên người dùng và nội dung của mỗi bài viết sẽ thay đổi. Do vậy, đây là cơ hội tuyệt vời để sử dụng các biến nhằm lưu giữ từng phần thông tin.

Hình minh hoạ này hiển thị 3 hộp nằm cạnh nhau. Hộp đầu tiên là name. Bên cạnh có một nhãn hiển thị "Alex". Có một mũi tên chỉ hướng từ "Alex" vào hộp. Điều này nghĩa là giá trị "Alex" đang được lưu trữ trong hộp tên. Hộp thứ hai là article1Name. Bên cạnh có một nhãn hiển thị "New movie coming out". Có một mũi tên chỉ hướng từ chuỗi vào hộp thứ hai. Điều này có nghĩa là giá trị "New movie coming out" đang được lưu trữ trong hộp article1Name. Hộp thứ ba là article1Date. Bên cạnh có một nhãn hiển thị "June 9". Có một mũi tên chỉ hướng từ "June 9" chuỗi vào hộp thứ ba. Điều này có nghĩa là giá trị "June 9" đang được lưu trữ trong hộp article1Date.

Bạn không muốn viết mã (hoặc các lệnh) trong ứng dụng tin tức mà chỉ hoạt động cho người dùng có tên Alex hoặc cho một bài tin tức luôn có cùng tiêu đề và ngày xuất bản. Thay vào đó, bạn muốn một ứng dụng linh hoạt hơn, do đó bạn nên viết mã của mình bằng cách tham chiếu đến các tên biến như name, article1Name, article1Date, v.v. Sau đó, mã của bạn sẽ trở nên tổng quát cho nhiều trường hợp sử dụng, trong đó tên người dùng và thông tin chi tiết về bài viết có thể khác đi.

Ứng dụng mẫu chứa các biến

Hãy xem ví dụ về một ứng dụng để tìm hiểu cách sử dụng các biến.

Ảnh chụp màn hình ứng dụng Google Maps này hiển thị thông tin về vị trí Googleplex. Đây là trụ sở một công ty, được mô tả là trụ sở chính của Google. Vị trí này có điểm xếp hạng 4,2 sao từ 9,831 bài đánh giá. Địa chỉ là 1600 Amphitheatre Pkwy, Mountain View, CA 94043. Trên màn hình có một tuỳ chọn cho phép người dùng lưu vị trí này trong danh sách của họ.

Trong ứng dụng Maps, bạn có thể tìm thấy màn hình thông tin về từng vị trí, chẳng hạn như nhà hàng hoặc doanh nghiệp. Ảnh chụp màn hình từ ứng dụng Google Maps ở trên hiển thị thông tin về trụ sở chính của Google - Googleplex. Bạn nghĩ những phần dữ liệu nào được lưu trữ dưới dạng biến trong ứng dụng?

  • Tên của vị trí
  • Điểm xếp hạng theo sao của vị trí
  • Số bài đánh giá của vị trí
  • Người dùng có lưu (hoặc đánh dấu) vị trí này hay chưa
  • Địa chỉ của vị trí
  • Mô tả của vị trí

Thay đổi dữ liệu được lưu trữ trong các biến này rồi bạn sẽ có ứng dụng bản đồ linh hoạt để hiển thị thông tin về các vị trí khác.

Kiểu dữ liệu

Khi bạn quyết định khía cạnh của ứng dụng có thể là biến, bạn phải chỉ định kiểu dữ liệu nào có thể được lưu trữ trong các biến đó. Trong Kotlin, có một số kiểu dữ liệu cơ bản phổ biến. Mỗi hàng của bảng phía dưới cho thấy các kiểu dữ liệu khác nhau. Đối với mỗi kiểu dữ liệu, sẽ có phần mô tả về loại dữ liệu có thể lưu giữ và giá trị mẫu.

Kiểu dữ liệu Kotlin

Loại dữ liệu mà kiểu dữ liệu này có thể chứa

Ví dụ về giá trị cố định

String

Văn bản

"Add contact"
"Search"
"Sign in"

Int

Số nguyên

32
1293490
-59281

Double

Số thập phân

2.0
501.0292
-31723.99999

Float

Số thập phân (ít chính xác hơn Double). Có f hoặc F ở cuối số.

5.0f
-1630.209f
1.2940278F

Boolean

true hoặc false. Hãy sử dụng kiểu dữ liệu này khi chỉ có hai giá trị có thể chọn. Lưu ý rằng truefalse là các từ khoá trong Kotlin.

true
false

Bây giờ, bạn đã biết một số kiểu dữ liệu Kotlin phổ biến. Kiểu dữ liệu nào sẽ phù hợp với từng biến được xác định trong trang thông tin vị trí mà bạn đã xem trước đó?

Ảnh chụp màn hình ứng dụng Google Maps này hiển thị thông tin về vị trí Googleplex. Đây là trụ sở một công ty, được mô tả là trụ sở chính của Google. Vị trí này có điểm xếp hạng 4,2 sao từ 9,831 bài đánh giá. Địa chỉ là 1600 Amphitheatre Pkwy, Mountain View, CA 94043. Trên màn hình có một tuỳ chọn cho phép người dùng lưu vị trí này trong danh sách của họ.

  • Tên của vị trí là văn bản, nên tên có thể được lưu trữ trong biến có kiểu dữ liệu là String.
  • Điểm xếp hạng theo sao của vị trí là một số thập phân (chẳng hạn như 4,2 sao) nên có thể được lưu trữ dưới dạng Double.
  • Số bài đánh giá của vị trí là một số nguyên, do đó bạn nên lưu trữ dữ liệu số bài đánh giá dưới dạng Int.
  • Việc người dùng có lưu vị trí này hay chưa chỉ có thể dưới dạng hai giá trị (đã lưu hoặc chưa lưu). Do vậy dữ liệu này được lưu trữ dưới dạng Boolean, trong đó truefalse có thể đại diện cho từng trạng thái.
  • Địa chỉ của vị trí là văn bản, vì vậy địa chỉ phải là String.
  • Mô tả của vị trí cũng là văn bản, vì vậy dữ liệu phải là String.

Thực hành trong hai trường hợp khác bên dưới. Xác định cách sử dụng các biến và kiểu dữ liệu của các biến đó trong các ứng dụng sau.

  1. Trong ứng dụng xem video, chẳng hạn như ứng dụng YouTube, sẽ có màn hình thông tin về video. Có thể sử dụng biến ở đâu? Kiểu dữ liệu của các biến đó là gì?

Ảnh chụp màn hình này cho biết một video đang được phát trong ứng dụng YouTube. Tên của video này là "Android Developers has reached 1M subscribers!" Video đã được đăng trên kênh YouTube Android Developers. Video này có 6.900 lượt xem, 541 lượt thích và 68 bình luận.

Không có một câu trả lời đúng hoàn toàn cho trường hợp này, nhưng trong ứng dụng xem video, bạn có thể dùng biến cho những đoạn dữ liệu sau:

  • Tên của video (String)
  • Tên của kênh (String)
  • Số lượt xem video (Int)
  • Số lượt thích video (Int)
  • Số lượt bình luận trên video (Int)
  1. Trong một ứng dụng email như Gmail, màn hình hộp thư đến sẽ liệt kê các email nhận được gần đây nhất. Có thể sử dụng biến ở đâu? Kiểu dữ liệu của các biến đó là gì?

Ảnh chụp màn hình ứng dụng Gmail này hiển thị danh sách thư trong hộp thư đến của người dùng. Hiện có 1 tin nhắn trong hộp thư đến từ người gửi Mary Joe. Chủ đề email là "This weekend". Có tuỳ chọn gắn dấu sao cho email.

Xin nhắc lại, không có một đáp án nào chính xác hoàn toàn. Trong một ứng dụng email, bạn có thể dùng các biến cho các đoạn dữ liệu sau:

  • Tên của người gửi (String)
  • Tiêu đề của email (String)
  • Email có được gắn dấu sao hay không (Boolean)
  • Số lượng email mới trong hộp thư đến (Int)

Thử nào

  1. Mở ứng dụng yêu thích trên điện thoại.
  2. Xác định phần mà bạn nghĩ rằng ứng dụng sử dụng biến trên màn hình cụ thể đó.
  3. Đoán biến đó thuộc kiểu dữ liệu gì.
  4. Hãy chia sẻ câu trả lời của bạn trên mạng xã hội bằng cách đăng ảnh chụp màn hình của ứng dụng, giải thích về những phần mà bạn cho rằng sử dụng biến và hashtag #AndroidBasics.

Tuyệt vời, bạn đang đạt kết quả xuất sắc trong lớp học lập trình này! Hãy chuyển đến phần tiếp theo để tìm hiểu thêm về cách sử dụng biến và kiểu dữ liệu trong mã.

3. Định nghĩa và sử dụng biến

Định nghĩa và sử dụng biến

Trước tiên, bạn phải định nghĩa biến trong mã của mình trước khi có thể sử dụng biến đó. Điều này tương tự như những điều bạn đã tìm hiểu được trong lớp học lập trình trước đó về việc xác định các hàm trước khi gọi các hàm đó.

Khi định nghĩa một biến, bạn sẽ gán tên để có thể xác định duy nhất biến đó. Bạn cũng có thể chỉ định kiểu dữ liệu mà biến có thể giữ. Cuối cùng, bạn có thể cung cấp một giá trị ban đầu sẽ được lưu trữ trong biến, nhưng điều này là không bắt buộc.

Sau khi định nghĩa một biến, bạn có thể sử dụng biến đó trong chương trình của mình. Để sử dụng một biến, hãy nhập tên biến trong mã của bạn. Hành động này sẽ cho trình biên dịch Kotlin biết rằng bạn muốn sử dụng giá trị của biến tại vị trí đó trong mã.

Ví dụ: định nghĩa biến cho số thư chưa đọc trong hộp thư đến của người dùng. Biến có thể có tên count. Lưu trữ một giá trị như số 2 bên trong biến, đại diện cho 2 thư chưa đọc trong hộp thư đến của người dùng. (Bạn có thể chọn một số khác để lưu trong biến, nhưng để phục vụ mục đích của ví dụ này, hãy sử dụng số 2.)

Có một hộp có chữ count ở trên. Bên ngoài hộp có nhãn ghi 2. Có một mũi tên chỉ hướng từ giá trị vào hộp, nghĩa là giá trị đó nằm bên trong hộp.

Mỗi khi mã cần truy cập số lượng tin nhắn chưa đọc, hãy nhập count vào mã. Khi thực thi các lệnh của bạn, trình biên dịch Kotlin sẽ thấy tên biến trong mã của bạn rồi sử dụng giá trị của biến thay cho tên đó.

Về mặt kỹ thuật, có các từ cụ thể hơn để mô tả quá trình này:

Biểu thức là một đơn vị mã nhỏ chứa giá trị. Biểu thức có thể được tạo thành từ các biến, lệnh gọi hàm, v.v. Trong trường hợp bên dưới, biểu thức được tạo thành từ một biến: biến count. Giá trị của biểu thức là 2.

Sơ đồ này cho thấy một biểu thức bên cạnh giá trị của chính biểu thức đó. Có một nhãn biểu thức và bên dưới ghi: count. Ở bên phải, có một nhãn giá trị và bên dưới ghi: 2.

Xác định có nghĩa là xác định giá trị của biểu thức. Trong trường hợp này, biểu thức có giá trị là 2. Trình biên dịch xác định giá trị các biểu thức trong mã và sử dụng các giá trị đó khi thực thi các lệnh trong chương trình.

Sơ đồ cho thấy biểu thức count có giá trị là 2.  Tên biến đếm (count) xuất hiện bên cạnh giá trị 2. Biến count được khoanh tròn và có một mũi tên chỉ từ biến count đến giá trị 2. Mũi tên được gắn nhãn cụm từ "có giá trị".

Để quan sát hành vi này trong Kotlin Playground, hãy chạy chương trình trong phần tiếp theo.

Ví dụ

  1. Mở Kotlin Playground trong trình duyệt web.
  2. Thay thế mã hiện tại trong Kotlin Playground bằng chương trình sau.

Chương trình này tạo một biến có tên là count với giá trị ban đầu là 2 rồi sử dụng bằng cách in ra giá trị của biến count cho kết quả. Đừng lo lắng nếu bạn chưa hiểu được tất cả khía cạnh của cú pháp mã. Nội dung này sẽ được giải thích chi tiết hơn trong các phần tiếp theo.

fun main() {
    val count: Int = 2
    println(count)
}
  1. Chạy chương trình và bạn sẽ được kết quả:
2

Khai báo biến

Trong chương trình bạn chạy, dòng mã thứ hai cho biết:

val count: Int = 2

Câu lệnh này tạo một biến số nguyên có tên là count và chứa số 2.

Có một hộp có chữ count ở trên. Bên ngoài hộp có nhãn ghi 2. Có một mũi tên chỉ hướng từ giá trị vào hộp, nghĩa là giá trị đó nằm bên trong hộp.

Có thể bạn sẽ cần một chút thời gian để làm quen với việc đọc cú pháp (hoặc định dạng) để khai báo biến trong Kotlin. Sơ đồ dưới đây cho biết vị trí từng phần của biến, cũng như vị trí của dấu cách và ký hiệu.

Sơ đồ này cho biết cú pháp để khai báo biến trong Kotlin. Khai báo biến bắt đầu bằng từ val với dấu cách phía sau. Ở bên phải từ này là một hộp có nhãn name (tên). Ở bên phải hộp name là dấu hai chấm. Sau dấu hai chấm, có một dấu cách rồi một hộp có nhãn data type (kiểu dữ liệu). Ở bên phải nhãn data type có một dấu cách, rồi dấu bằng rồi một dấu cách khác. Ở bên phải hộp là một hộp có nhãn initial value (giá trị ban đầu).

Trong ví dụ về biến count, bạn có thể thấy khai báo biến bắt đầu bằng từ val. Tên của biến là count. kiểu dữ liệu là Int và giá trị ban đầu là 2.

Sơ đồ này hiển thị dòng mã: val count: Int = 2 Có các mũi tên chỉ vào các phần của mã giúp giải thích phần đó là gì. Có một nhãn name chỉ đến từ count trong mã. Có một nhãn data type chỉ đến từ Int trong mã. Có một nhãn initial value chỉ đến số 2 trong mã.

Mỗi phần trong khai báo biến đều được giải thích chi tiết hơn ở phía dưới.

Từ khoá để định nghĩa biến mới

Để định nghĩa biến mới, hãy bắt đầu bằng từ khoá Kotlin val (là từ viết tắt của value). Sau đó, trình biên dịch Kotlin biết rằng phần khai báo biến nằm trong câu lệnh này.

Tên biến

Giống như việc đặt tên cho một hàm, bạn cũng cần đặt tên cho biến. Trong phần khai báo biến, tên biến sẽ theo sau từ khoá val.

Sơ đồ này cho biết cú pháp để khai báo biến trong Kotlin. Khai báo biến bắt đầu bằng từ val với dấu cách phía sau. Ở bên phải từ này là một hộp có nhãn name (tên). Hộp name được làm nổi bật với đường viền và nền màu xanh lục để làm ta chú ý vào phần này trong khai báo biến. Ở bên phải hộp name là dấu hai chấm. Sau dấu hai chấm, có một dấu cách rồi một hộp có nhãn data type (kiểu dữ liệu). Ở bên phải nhãn data type có một dấu cách, rồi dấu bằng rồi một dấu cách khác. Ở bên phải hộp là một hộp có nhãn initial value (giá trị ban đầu).

Bạn có thể chọn bất kỳ tên biến nào mình muốn, nhưng tốt nhất nên tránh sử dụng từ khóa Kotlin làm tên biến.

Tốt nhất bạn nên chọn tên mô tả dữ liệu mà biến lưu trữ để mã dễ đọc hơn.

Tên biến phải tuân theo quy ước viết hoa Camel như đã học trong phần tên hàm. Từ đầu tiên của tên biến được viết thường. Nếu tên biến có nhiều từ thì không được có dấu cách giữa các từ và tất cả từ khác phải bắt đầu bằng một chữ cái viết hoa.

Ví dụ về tên biến:

  • numberOfEmails
  • cityName
  • bookPublicationDate

Trong ví dụ về mã trước đó, count là tên của biến.

val count: Int = 2

Kiểu dữ liệu của biến

Sau tên biến, bạn sẽ thêm dấu hai chấm, dấu cách và kiểu dữ liệu của biến. Như đã đề cập trước đó, String, Int, Double, Float,Boolean là một số kiểu dữ liệu Kotlin cơ bản. Bạn sẽ tìm hiểu thêm về các kiểu dữ liệu khác trong khoá học này. Hãy nhớ viết kiểu dữ liệu chính xác như được hướng dẫn và bắt đầu mỗi kiểu dữ liệu bằng một chữ cái viết hoa.

Sơ đồ này cho biết cú pháp để khai báo biến trong Kotlin. Khai báo biến bắt đầu bằng từ val với dấu cách phía sau. Ở bên phải từ này là một hộp có nhãn name (tên). Ở bên phải hộp name là dấu hai chấm. Sau dấu hai chấm, có một dấu cách rồi một hộp có nhãn data type (kiểu dữ liệu). Hộp data type được làm nổi bật với đường viền và nền màu xanh lục để làm ta chú ý vào phần này trong khai báo biến. Ở bên phải của hộp data type có một dấu cách, dấu bằng rồi một dấu cách khác. Ở bên phải hộp là một hộp có nhãn initial value (giá trị ban đầu).

Đối với ví dụ về biến count, Int là kiểu dữ liệu của biến.

val count: Int = 2

Toán tử gán

Trong phần khai báo biến, dấu bằng (=) theo sau kiểu dữ liệu. Dấu bằng được gọi là toán tử gán. Toán tử gán sẽ gán một giá trị cho biến. Nói cách khác, giá trị ở vế phải của dấu bằng được lưu trữ trong biến ở vế trái của dấu bằng.

Sơ đồ này hiện thị dòng mã: val count: Int = 2 Có một mũi tên chỉ từ 2 (ở bên phải dấu bằng) vào từ count (ở bên trái dấu bằng) , Điều này nghĩa rằng giá trị 2 đang được lưu trữ vào biến count.

Giá trị biến ban đầu

Giá trị biến là dữ liệu thật sự được lưu trữ trong biến.

Sơ đồ này cho biết cú pháp để khai báo biến trong Kotlin. Khai báo biến bắt đầu bằng từ val với dấu cách phía sau. Ở bên phải từ này là một hộp có nhãn name (tên). Ở bên phải hộp name là dấu hai chấm. Sau dấu hai chấm, có một dấu cách rồi một hộp có nhãn data type (kiểu dữ liệu). Ở bên phải của hộp data type có một dấu cách, dấu bằng rồi một dấu cách khác. Ở bên phải hộp là một hộp có nhãn initial value (giá trị ban đầu). Hộp initial value (giá trị ban đầu) được làm nổi bật với đường viền và nền màu xanh lục để thu hút sự chú ý vào phần này trong khai báo biến.

Đối với ví dụ về biến count, số 2 là giá trị ban đầu của biến.

val count: Int = 2

Bạn cũng có thể nghe thấy cụm từ: "biến count được khởi tạo với 2". Điều này có nghĩa là khi khai báo biến, 2 là giá trị đầu tiên được lưu trữ trong biến.

Giá trị ban đầu sẽ khác nhau, tuỳ thuộc vào kiểu dữ liệu được khai báo cho biến.

Hãy tham khảo bảng phía dưới mà bạn có thể vẫn nhớ từ lớp học lập trình trước. Cột thứ ba cho biết các giá trị mẫu có thể lưu trữ được trong một biến thuộc từng kiểu dữ liệu tương ứng. Các giá trị này được gọi là giá trị cố định (literal) vì những giá trị này cố định và là hằng (giá trị luôn không đổi.) Ví dụ: số nguyên 32 luôn có giá trị là 32. Ngược lại, biến không cố định khi giá trị của biến có thể thay đổi. Bạn có thể thấy các giá trị cố định này được đề cập dựa trên kiểu: giá trị cố định kiểu chuỗi (string literal), giá trị cố định kiểu số nguyên (integer literal), giá trị cố định kiểu boolean (boolean literal), v.v.

Kiểu dữ liệu Kotlin

Loại dữ liệu mà kiểu dữ liệu này có thể chứa

Ví dụ về giá trị cố định

String

Văn bản

"Add contact"
"Search"
"Sign in"

Int

Số nguyên

32
1293490
-59281

Double

Số thập phân

2.0
501.0292
-31723.99999

Float

Số thập phân (ít chính xác hơn Double). Có f hoặc F ở cuối số.

5.0f
-1630.209f
1.2940278F

Boolean

true hoặc false. Hãy sử dụng kiểu dữ liệu này khi chỉ có hai giá trị có thể chọn. Lưu ý rằng truefalse là các từ khoá trong Kotlin.

true
false

Điều quan trọng là bạn phải cung cấp một giá trị thích hợp và hợp lệ theo kiểu dữ liệu của biến. Ví dụ: bạn không thể lưu trữ giá trị cố định kiểu chuỗi như "Hello" bên trong biến kiểu Int vì trình biên dịch Kotlin sẽ báo lỗi.

Sử dụng biến

Dưới đây là chương trình mà bạn đã chạy trong Kotlin Playground. Cho đến giờ, bạn đã biết rằng dòng mã thứ hai tạo một biến số nguyên mới có tên là count với giá trị là 2.

fun main() {
    val count: Int = 2
    println(count)
}

Bây giờ, hãy xem dòng mã thứ ba. Bạn đang in kết quả của biến count:

println(count)

Hãy chú ý rằng không có dấu ngoặc kép nào xung quanh từ count. Đó là tên biến, không phải là giá trị cố định kiểu chuỗi. (Bạn sẽ thấy dấu ngoặc kép xung quanh từ đó nếu từ đó là giá trị cố định kiểu chuỗi). Khi bạn chạy chương trình, trình biên dịch Kotlin sẽ tính giá trị biểu thức bên trong dấu ngoặc đơn (là count) cho lệnh println(). Vì biểu thức có giá trị 2, nên phương thức println() được gọi với 2 làm dữ liệu đầu vào: println(2).

Do đó, kết quả của chương trình là:

2

Chỉ riêng con số trong kết quả không hữu ích lắm. Sẽ hữu ích hơn nếu bạn in thông điệp chi tiết hơn trong kết quả để giải thích nội dung 2.

Mẫu chuỗi

Kết quả với một thông điệp hữu ích hơn có thể là:

You have 2 unread messages.

Hãy làm theo các bước dưới đây để chương trình đưa ra một thông điệp hữu ích hơn.

  1. Cập nhật chương trình trong Kotlin Playground với mã phía dưới. Đối với lệnh gọi println(), hãy chuyển thành một giá trị cố định kiểu chuỗi chứa tên biến count. Hãy nhớ đặt phần văn bản trong dấu ngoặc kép. Lưu ý rằng bạn sẽ không nhận được kết quả như mong đợi. Bạn sẽ khắc phục vấn đề này ở bước sau.
fun main() {
    val count: Int = 2
    println("You have count unread messages.")
}
  1. Chạy chương trình rồi kết quả sẽ hiển thị:
You have count unread messages.

Câu này không có ý nghĩa! Bạn muốn giá trị của biến count hiển thị trong thông báo chứ không phải tên biến.

  1. Để sửa chương trình của bạn, hãy thêm ký hiệu đô la $ trước biến count: "You have $count unread messages." Đây là mẫu chuỗi do chứa biểu thức mẫu, trong trường hợp này là $count. Biểu thức mẫu là một biểu thức được xác định với một giá trị, sau đó được thay vào chuỗi. Trong trường hợp này, biểu thức mẫu $count có giá trị 2, và 2 được thay vào chuỗi có chứa biểu thức này.
fun main() {
    val count: Int = 2
    println("You have $count unread messages.")
}
  1. Khi chạy chương trình, bạn sẽ có được kết quả phù hợp với mục tiêu mong muốn:
You have 2 unread messages.

Người dùng sẽ thấy câu này có ý nghĩa!

  1. Bây giờ, hãy thay đổi giá trị ban đầu của biến count thành một integer literal khác. Ví dụ: bạn có thể chọn số 10. Giữ nguyên phần còn lại của mã trong chương trình.
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. Chạy chương trình. Hãy chú ý rằng kết quả sẽ thay đổi tương ứng với giá trị và bạn thậm chí không cần phải thay đổi câu lệnh println() trong chương trình.
You have 10 unread messages.

Bạn có thể thấy mẫu chuỗi hữu ích như thế nào. Bạn chỉ cần viết mẫu chuỗi một lần trong mã ("You have $count unread messages."). Nếu bạn thay đổi giá trị ban đầu của biến count, câu lệnh println() vẫn sẽ hoạt động. Mã của bạn đã trở nên linh hoạt hơn!

Để làm nổi bật thêm điểm này, hãy so sánh hai chương trình bên dưới. Chương trình đầu tiên bên dưới sử dụng giá trị cố định kiểu chuỗi, trong chuỗi có số lượng chính xác các tin nhắn chưa đọc. Chương trình này chỉ hoạt động khi người dùng có 10 tin nhắn chưa đọc.

fun main() {
    println("You have 10 unread messages.")
}

Bằng cách sử dụng biến và mẫu chuỗi trong chương trình thứ hai bên dưới, mã có thể thích ứng với nhiều tình huống hơn. Chương trình thứ hai này linh hoạt hơn!

fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}

Suy luận kiểu dữ liệu

Dưới đây là một mẹo cho phép bạn viết ít mã hơn khi khai báo biến.

Suy luận kiểu dữ liệu (type inference) là khi trình biên dịch Kotlin có thể suy luận (hoặc xác định) biến nên thuộc kiểu dữ liệu nào, mà thông tin về kiểu dữ liệu không được ghi rõ ràng trong mã. Điều đó có nghĩa là bạn có thể bỏ qua kiểu dữ liệu trong khai báo biến nếu bạn cung cấp giá trị ban đầu cho biến. Trình biên dịch Kotlin xem xét kiểu dữ liệu của giá trị ban đầu rồi giả định rằng bạn muốn biến lưu trữ dữ liệu thuộc kiểu đó.

Dưới đây là cú pháp để khai báo biến có sử dụng suy luận kiểu dữ liệu:

Sơ đồ này cho thấy cú pháp để khai báo biến trong Kotlin bằng cách sử dụng suy luận kiểu dữ liệu. Khai báo biến bắt đầu bằng từ val với dấu cách phía sau. Ở bên phải từ này là một hộp có nhãn name (tên). Ở bên phải của hộp name có một dấu cách, dấu bằng rồi một dấu cách khác. Ở bên phải hộp là một hộp có nhãn initial value (giá trị ban đầu).

Quay lại ví dụ về count, ban đầu chương trình có chứa dòng mã sau:

val count: Int = 2

Tuy nhiên, dòng mã này cũng có thể được viết như sau. Xin lưu ý rằng dấu hai chấm (:) và kiểu dữ liệu Int đều bị bỏ qua. Cú pháp được cập nhật có ít từ hơn và giúp bạn đạt được kết quả tương tự khi tạo biến Int có tên là count với giá trị 2.

val count = 2

Trình biên dịch Kotlin biết rằng bạn muốn lưu trữ 2 (một số nguyên) vào biến count, vì vậy trình biên dịch có thể suy luận rằng biến count thuộc kiểu Int. Thật tiện lợi, đúng không? Đây là một ví dụ về việc bạn có thể viết mã Kotlin ngắn gọn hơn!

Mặc dù ví dụ này chỉ thảo luận về biến kiểu Int, nhưng khái niệm suy luận kiểu dữ liệu áp dụng cho tất cả kiểu dữ liệu trong Kotlin.

Các phép toán cơ bản với số nguyên

Sự khác biệt giữa biến Int có giá trị 2 và biến String có giá trị "2" là gì? Khi cả hai được in ra, kết quả đều giống nhau.

Ưu điểm của việc lưu trữ số nguyên dưới dạng Int (trái ngược với dạng String ) là bạn có thể thực hiện các phép toán với biến Int, chẳng hạn như cộng, trừ, nhân và chia (xem các phép toán khác). Ví dụ: bạn có thể cộng hai biến số nguyên để tính tổng. Trong một số trường hợp, bạn nên lưu trữ các số nguyên dưới dạng string. Tuy nhiên, mục đích của phần này là để hướng dẫn những việc bạn có thể làm với biến Int.

  1. Quay lại Kotlin Background và xóa toàn bộ mã trong trình chỉnh sửa mã.
  2. Tạo một chương trình mới nơi bạn xác định một biến số nguyên cho số lượng email chưa đọc trong hộp thư đến và khởi tạo biến đó thành một giá trị như 5. Bạn có thể chọn một số khác nếu muốn. Định nghĩa biến số nguyên thứ hai cho số email đã đọc trong hộp thư đến. Khởi tạo biến này với một giá trị như 100. Bạn có thể chọn một số khác nếu muốn. Sau đó in ra tổng số thư trong hộp thư đến bằng cách cộng hai số nguyên với nhau.
fun main() {
    val unreadCount = 5
    val readCount = 100
    println("You have ${unreadCount + readCount} total messages in your inbox.")
}
  1. Chạy chương trình để hiển thị tổng số thư trong hộp thư đến:
You have 105 total messages in your inbox.

Đối với mẫu chuỗi, bạn đã biết rằng mình có thể đặt ký hiệu $ trước tên biến duy nhất. Tuy nhiên, nếu có một biểu thức phức tạp hơn, bạn phải đưa biểu thức đó vào trong dấu ngoặc nhọn với ký hiệu $ ở trước dấu ngoặc nhọn: ${unreadCount + readCount}. Biểu thức trong dấu ngoặc nhọn unreadCount + readCountcó giá trị 105. Sau đó, giá trị 105 được cộng thay vào giá trị cố định kiểu chuỗi.

Sơ đồ này cho thấy một biểu thức bên cạnh giá trị của chính biểu thức đó. Có một nhãn expression và bên dưới ghi: readCount + readCount. Ở bên phải nhãn đó, có một nhãn value và bên dưới ghi: 105.

  1. Để khám phá thêm về chủ đề này, hãy tạo các biến có tên và giá trị ban đầu khác nhau, đồng thời sử dụng biểu thức mẫu để in thông điệp kết quả.

Ví dụ: sửa đổi chương trình của bạn để in nội dung này:

100 photos
10 photos deleted
90 photos left

Dưới đây là một cách để bạn có thể viết chương trình, tuy nhiên có nhiều cách đúng khác để viết chương trình này!

fun main() {
    val numberOfPhotos = 100
    val photosDeleted = 10
    println("$numberOfPhotos photos")
    println("$photosDeleted photos deleted")
    println("${numberOfPhotos - photosDeleted} photos left")
}

4. Cập nhật biến

Khi một ứng dụng đang chạy, bạn có thể cần cập nhật giá trị của biến. Ví dụ: trong một ứng dụng mua sắm, khi người dùng thêm mặt hàng vào giỏ hàng, thì tổng số mặt hàng trong giỏ sẽ tăng lên.

Hãy đơn giản hoá trường hợp ứng dụng mua sắm thành một chương trình đơn giản. Logic được viết ra bên dưới bằng ngôn ngữ của con người chứ không phải bằng Kotlin. Đây được gọi là mã giả (pseudocode) vì mô tả các điểm quan trọng về cách viết mã, nhưng không chứa tất cả chi tiết của mã.

Trong chức năng chính của chương trình:

  • Tạo biến số nguyên cartTotal bắt đầu với giá trị 0.
  • Người dùng thêm một áo len có giá 20 đô la vào giỏ hàng.
  • Cập nhật biến cartTotal thành 20, đây là chi phí hiện tại của các mặt hàng trong giỏ hàng.
  • In tổng chi phí của các mặt hàng trong giỏ hàng (biến cartTotal) thành kết quả.

Để đơn giản hoá mã hơn nữa, bạn không cần viết mã cho trường hợp khi người dùng thêm mặt hàng vào giỏ hàng. (Bạn vẫn chưa tìm hiểu về cách thức một chương trình có thể phản hồi thông tin người dùng cung cấp. Bạn sẽ học về kiến thức này ở bài sau.) Do đó, hãy tập trung vào những phần mà bạn tạo, cập nhật và in biến cartTotal.

  1. Thay thế mã hiện tại trong Kotlin Playground bằng chương trình bên dưới. Trong dòng 2 của chương trình, bạn sẽ khởi tạo biến cartTotal với giá trị 0. Vì bạn cung cấp một giá trị ban đầu nên không cần chỉ định kiểu dữ liệu Int do suy luận kiểu dữ liệu. Trong hàng 3 của chương trình, bạn hãy thử cập nhật biến cartTotal thành 20 với toán tử gán (=). Trong dòng 4 của chương trình, bạn in biến cartTotal bằng cách sử dụng một mẫu chuỗi.
fun main() {
    val cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Chạy chương trình và bạn nhận được lỗi biên dịch.
  2. Xin lưu ý rằng lỗi này cho biết rằng val không thể gán lại. Lỗi nằm ở dòng thứ ba của chương trình, khi cố gắng thay đổi giá trị của biến cartTotal thành20.. Không thể gán biến val cartTotalvới một giá trị khác (20) sau khi biến đó đã được gán cho một giá trị ban đầu (0 ).
Val cannot be reassigned

Nếu bạn cần cập nhật giá trị của biến, hãy khai báo biến bằng từ khoá Kotlin var thay vì val.

  • Từ khoá val – Sử dụng khi bạn dự kiến giá trị biến sẽ không thay đổi.
  • Từ khoá var – Sử dụng khi bạn dự kiến giá trị biến có thể thay đổi.

Với val, biến thuộc kiểu chỉ có thể đọc, nghĩa là bạn chỉ có thể đọc hoặc truy cập giá trị của biến. Sau khi đặt giá trị, bạn không thể chỉnh sửa hoặc sửa đổi giá trị của biến. Với var, biến thuộc kiểu có thể thay đổi, nghĩa là giá trị có thể được thay đổi hoặc sửa đổi. Bạn có thể thay đổi giá trị của biến.

Để ghi nhớ sự khác biệt, hãy xem val là một giá trị cố định và varbiến. Trong Kotlin, bạn nên sử dụng từ khoá val thay vì từ khoá var khi có thể.

  1. Cập nhật phần khai báo biến cho cartTotal ở dòng 2 của chương trình để sử dụng var thay vì val. Mã sẽ nhìn như thế này:
fun main() {
    var cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Hãy chú ý cú pháp mã ở dòng 3 của chương trình có nhiệm vụ cập nhật biến.
cartTotal = 20

Sử dụng toán tử gán (=) để gán giá trị mới (20) cho biến hiện hữu (cartTotal). Bạn không cần phải sử dụng lại từ khoá var vì biến này đã được định nghĩa.

Sơ đồ này hiện thị dòng mã: cartTotal = 20 Có một mũi tên chỉ từ 20 (ở bên phải dấu bằng) vào từ cartTotal (ở bên trái dấu bằng) , Điều này cho thấy rằng giá trị 20 đang được lưu trữ trong biến CartTotal.

Quay lại ví dụ về hộp, hãy tưởng tượng giá trị 20 đang được lưu trữ trong hộp có nhãn cartTotal.

Có một hộp với chữ cartTotal trên đó. Bên ngoài hộp có một nhãn ghi 20. Có một mũi tên chỉ hướng từ giá trị vào hộp, nghĩa là giá trị đó nằm bên trong hộp.

Dưới đây là sơ đồ về cú pháp chung để cập nhật biến đã được khai báo ở dòng mã trước đó. Bắt đầu câu lệnh có tên của biến mà bạn muốn cập nhật. Thêm một dấu cách, dấu bằng, theo sau là một dấu cách khác. Sau đó, hãy nhập giá trị cập nhật cho biến đó.

Sơ đồ này cho thấy cú pháp cập nhật biến trong Kotlin. Dòng mã bắt đầu bằng một hộp có nhãn name. Ở bên phải của hộp name có một dấu cách, dấu bằng rồi một dấu cách khác. Ở bên phải dấu cách là một hộp có nhãn updated value.

  1. Chạy chương trình và giờ thì mã sẽ được biên dịch thành công. Mã sẽ in kết quả này :
Total: 20
  1. Để xem giá trị biến thay đổi như thế nào khi chương trình đang chạy, hãy in biến cartTotal ra kết quả sau khi biến được khai báo lần đầu. Hãy xem những thay đổi của mã phía dưới. Dòng 3 có câu lệnh println() mới. Cũng có một dòng trống được thêm vào dòng 4 của mã. Dòng trống không ảnh hưởng đến việc trình biên dịch hiểu mã. Thêm một dòng trống để có thể dễ đọc mã hơn bằng cách tách các khối mã liên quan.
fun main() {
    var cartTotal = 0
    println("Total: $cartTotal")

    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Chạy lại chương trình và kết quả sẽ là:
Total: 0
Total: 20

Bạn có thể thấy rằng tổng số mặt hàng trong giỏ ban đầu là 0. Sau đó, số mặt hàng cập nhật thành 20. Bạn đã thành công cập nhật một biến! Điều này là vì bạn đã thay đổi cartTotal từ biến chỉ có thể đọc (với val) thành biến có thể thay đổi (với var).

Hãy nhớ chỉ nên sử dụng var để khai báo biến nếu bạn muốn giá trị thay đổi. Nếu không, bạn nên sử dụng val để khai báo biến. Cách này giúp mã an toàn hơn. Việc sử dụng val sẽ đảm bảo rằng các biến sẽ không được cập nhật trong chương trình nếu bạn không muốn. Sau khi được gán một giá trị, val sẽ luôn giữ nguyên giá trị đó.

Toán tử tăng và toán tử giảm

Bây giờ, bạn đã biết rằng một biến phải được khai báo là var để có thể cập nhật giá trị. Hãy áp dụng kiến thức này vào ví dụ email quen thuộc bên dưới.

  1. Thay thế mã trong Kotlin Playground bằng chương trình này:
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. Chạy chương trình. Kết quả sẽ in ra như sau:
You have 10 unread messages.
  1. Hãy thay thế từ khoá val bằng từ khoá var để chuyển biến count thành biến có thể thay đổi. Kết quả khi bạn chạy chương trình sẽ không thay đổi.
fun main() {
    var count: Int = 10
    println("You have $count unread messages.")
}
  1. Tuy nhiên, giờ đây bạn có thể cập nhật count thành một giá trị khác. Ví dụ: khi hộp thư đến có một email mới, bạn có thể tăng count thêm 1. (Bạn không cần phải viết mã cho việc nhận email mới. Việc lấy dữ liệu từ Internet là một chủ đề nâng cao mà chúng ta sẽ tìm hiểu ở bài sau). Hiện tại, hãy tập trung vào việc tăng giá trị biến count thêm 1 bằng dòng mã sau:
count = count + 1

Biểu thức ở bên phải của dấu bằng là count + 1 và có giá trị là 11. Lý do là giá trị hiện tại của count10 (nằm ở dòng 2 của chương trình) và 10 + 1 bằng 11. Sau đó thông qua toán tử gán, giá trị 11 sẽ được gán hoặc lưu trữ trong biến count.

Sơ đồ này hiển thị dòng mã: count = count + 1 Có một vòng tròn xung quanh biểu thức: count + 1. Có một mũi tên chỉ từ biểu thức được khoanh tròn (ở bên phải dấu bằng) vào từ count (ở bên trái dấu bằng). Điều này cho thấy rằng giá trị của biểu thức count + 1 đang được lưu trữ trong biến count.

Thêm dòng mã này ở cuối hàm main() của chương trình. Mã của bạn sẽ nhìn như sau:

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
}

Nếu chạy chương trình ngay bây giờ, bạn sẽ nhận được kết quả giống như trước vì bạn chưa thêm mã nào để sử dụng biến count sau khi cập nhật.

  1. Thêm một lệnh print khác để in số thư chưa đọc sau khi cập nhật biến.
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
    println("You have $count unread messages.")
}
  1. Chạy chương trình. Thông điệp thứ hai sẽ hiển thị biến count được cập nhất với 11 tin nhắn mới.
You have 10 unread messages.
You have 11 unread messages.
  1. Nói ngắn gọn, nếu muốn tăng giá trị biến thêm 1, bạn có thể sử dụng toán tử tăng (++) được tạo thành bởi hai dấu cộng. Bằng cách sử dụng các ký hiệu này ngay sau tên biến, bạn báo cho trình biên dịch biết mình muốn thêm 1 vào giá trị hiện tại của biến, sau đó lưu trữ giá trị mới trong biến. Hai dòng mã sau đây tạo ra kết quả giống nhau, nhưng việc sử dụng toán tử tăng ++ sẽ giúp bạn rút ngắn mã.
count = count + 1
count++

Sửa đổi mã và sau đó chạy chương trình. Không được có dấu cách giữa tên biến và toán tử tăng.

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count++
    println("You have $count unread messages.")
}
  1. Chạy chương trình. Kết quả vẫn như cũ nhưng giờ bạn đã biết thêm về một toán tử mới!
You have 10 unread messages.
You have 11 unread messages.
  1. Bây giờ, hãy sửa đổi dòng 4 của chương trình để sử dụng toán tử giảm (--) sau tên biến count. Toán tử giảm được tạo thành từ hai dấu trừ. Bằng cách đặt toán tử giảm sau tên biến, bạn cho trình biên dịch biết rằng bạn muốn giảm giá trị của biến đi 1 và lưu trữ giá trị mới vào biến.
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count--
    println("You have $count unread messages.")
}
  1. Chạy chương trình. Chương trình sẽ in kết quả này:
You have 10 unread messages.
You have 9 unread messages.

Trong phần này, bạn đã tìm hiểu cách cập nhật biến có thể thay đổi bằng cách sử dụng toán tử tăng (++) và toán tử giảm (--). Cụ thể hơn, count++ giống với count = count + 1, count-- giống với count = count - 1.

5. Khám phá các kiểu dữ liệu khác

Trong phần trước của lớp học lập trình, bạn đã học về một số kiểu dữ liệu cơ bản phổ biến: String, Int, Double, Boolean. Bạn vừa sử dụng kiểu dữ liệu Int, giờ đây bạn sẽ khám phá các kiểu dữ liệu khác.

Kiểu dữ liệu Kotlin

Loại dữ liệu mà kiểu dữ liệu này có thể chứa

String

Văn bản

Int

Số nguyên

Double

Số thập phân

Boolean

true hoặc false (chỉ có hai giá trị có thể chọn)

Hãy thử các chương trình này trong Kotlin Playground để xem kết quả.

Double (Số thập phân)

Khi bạn cần một biến có giá trị thập phân, hãy sử dụng biến Double. Để tìm hiểu về phạm vi hợp lệ của biến Double, hãy tham khảo bảng này và xem ví dù về các chữ số thập phân mà biến này có thể lưu trữ.

Hãy tưởng tượng bạn đang di chuyển đến một điểm, chuyến đi của bạn được chia thành ba phần riêng biệt vì bạn cần dừng xe dọc đường. Chương trình này cho biết tổng quãng đường còn lại cho tới điểm đến.

  1. Hãy nhập mã này vào Kotlin Playground. Bạn có thể hiểu được điều gì đang xảy ra ở mỗi dòng mã không?
fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = 0.0
    println("$totalTripLength miles left to destination")
}

Ba biến trip1, trip2trip3 được khai báo để biểu thị khoảng cách của từng phần trong chuyến đi. Tất cả đều là biến Double vì lưu trữ giá trị thập phân. Sử dụng val để khai báo từng biến vì các giá trị của biến không thay đổi trong toàn bộ chương trình. Chương trình này cũng tạo một biến thứ tư có tên là totalTripLength, hiện đang được khởi tạo với 0.0. Dòng cuối cùng của chương trình in một thông điệp với giá trị totalTripLength.

  1. Hãy sửa mã để biến totalTripLength là tổng quãng đường của ba phần chuyến đi.
val totalTripLength: Double = trip1 + trip2 + trip3

Biểu thức ở bên phải của dấu bằng có giá trị là 9.023.20 + 4.10 + 1.72 bằng 9.02. Giá trị 9.02 được lưu trữ trong biến totalTripLength.

Sơ đồ này hiển thị dòng mã: val totalTripLength: Double = trip1 + trip2 + trip3 Có một vòng tròn xung quanh biểu thức: trip1 + trip2 + trip3. Có một mũi tên chỉ từ biểu thức được khoanh tròn (ở bên phải dấu bằng) vào từ totalTripLength (ở bên trái dấu bằng). Điều này cho thấy rằng giá trị của biểu thức Trip1 + Trip2 + Trip3 đang được lưu trữ trong biến totalTripLength.

Toàn bộ chương trình của bạn sẽ nhìn như mã phía dưới:

fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. Chạy chương trình. Chương trình sẽ in ra:
9.02 miles left to destination
  1. Sửa mã để xoá kiểu dữ liệu Double không cần thiết khỏi khai báo biến nhờ suy luận kiểu dữ liệu. Trình biên dịch Kotlin có thể dự đoán rằng các biến này thuộc kiểu dữ liệu Double dựa trên giá trị ban đầu là số thập phân.
fun main() {
    val trip1 = 3.20
    val trip2 = 4.10
    val trip3 = 1.72
    val totalTripLength = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. Hãy chạy lại mã để đảm bảo rằng mã vẫn có thể được biên dịch. Kết quả sẽ giống nhau, nhưng giờ đây mã của bạn đã đơn giản hơn!

String (Chuỗi)

Khi bạn cần một biến có thể lưu trữ văn bản, hãy sử dụng biến String. Hãy nhớ sử dụng dấu ngoặc kép xung quanh giá trị cố định String, chẳng hạn như "Hello Kotlin", nhưng giá trị cố định IntDouble không có dấu ngoặc kép.

  1. Sao chép và dán chương trình này vào Kotlin Playground.
fun main() {
    val nextMeeting = "Next meeting is:"
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}

Hãy lưu ý rằng có hai biến String được khai báo, biến nextMeeting và biến date. Sau đó, biến String thứ ba có tên là reminder được khai báo và được đặt giá trị bằng biến nextMeeting cộng biến date.

Với biểu tượng +, bạn có thể kết hợp hai chuỗi với nhau, điều này được gọi là phép nối. Hai chuỗi này được kết hợp với nhau, chuỗi này sau chuỗi kia. Kết quả của biểu thức, nextMeeting + date"Next meeting is:January 1" như được thể hiện trong sơ đồ dưới đây.

Sơ đồ cho thấy biểu thức nextMeeting + date có giá trị là "Next meeting is:January 1".  Biểu thức nextMeeting + date được khoanh tròn, có một mũi tên chỉ từ biểu thức đến giá trị "Next meeting is:January 1". Mũi tên được gắn nhãn cụm từ "có giá trị".

Sau đó, giá trị "Next meeting is:January 1" được lưu trữ vào biến reminder bằng toán tử gán ở dòng 4 của chương trình.

  1. Chạy chương trình Chương trình sẽ in ra:
Next meeting is:January 1

Khi bạn nối hai chuỗi với nhau, sẽ không có khoảng trống giữa hai chuỗi đó. Nếu muốn có một dấu cách sau dấu hai chấm trong chuỗi kết quả, bạn cần thêm dấu cách vào một trong hai chuỗi.

  1. Cập nhật biến nextMeeting để có thêm một dấu cách ở cuối chuỗi trước dấu ngoặc kép đóng. (Ngoài ra, bạn có thể thêm một dấu cách vào đầu biến date). Chương trình của bạn sẽ nhìn như sau:
fun main() {
    val nextMeeting = "Next meeting is: "
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}
  1. Hãy chạy lại chương trình. Giờ đây, bạn sẽ thấy một dấu cách sau dấu hai chấm trong thông báo đầu ra.
Next meeting is: January 1
  1. Sửa đổi mã để nối (hoặc thêm) một đoạn văn bản khác vào biểu thức được lưu trữ trong biến reminder.

Sử dụng dấu + để thêm giá trị cố định kiểu chuỗi "at work" vào cuối chuỗi reminder.

  1. Chạy chương trình.

Chương trình sẽ in kết quả này:

Next meeting is: January 1 at work

Đoạn mã dưới đây cho bạn biết một cách để có thể triển khai hành vi.

fun main() {
    val nextMeeting = "Next meeting is: "
    val date = "January 1"
    val reminder = nextMeeting + date + " at work"
    println(reminder)
}

Xin lưu ý rằng không có dấu ngoặc kép nào xung quanh nextMeetingdate vì đó là tên của các biến chuỗi hiện hữu (mà giá trị của biến là văn bản có dấu ngoặc kép). Ngược lại, giá trị cố định "at work" trước đó không được định nghĩa trong bất kỳ biến nào. Do đó hãy thêm dấu ngoặc kép xung quanh văn bản này để trình biên dịch biết rằng đây là một chuỗi nên được nối với các chuỗi khác.

Về mặt kỹ thuật, bạn có thể nhận được cùng một kết quả bằng cách khai báo một biến String duy nhất với toàn bộ văn bản thay vì sử dụng các biến riêng biệt. Tuy nhiên, mục đích của bài tập này là minh hoạ cách bạn có thể khai báo và thao tác các biến String, đặc biệt là cách nối các chuỗi riêng biệt.

  1. Khi đọc mã có chứa chuỗi, bạn có thể gặp dãy ký tự thoát (escape sequences). Dãy ký tự thoát là các ký tự đứng sau dấu gạch chéo ngược (\), cũng được gọi là dấu gạch chéo ngược thoát.

Ví dụ: \" nằm trong giá trị cố định kiểu chuỗi ở ví dụ dưới đây. Sao chép và dán mã này vào Kotlin Playground.

fun main() {
    println("Say \"hello\"")
}

Bạn đã tìm hiểu trước đó cách sử dụng dấu ngoặc kép xung quanh chuỗi ký tự. Nhưng nếu bạn muốn sử dụng ký hiệu " trong chuỗi của mình thì sao? Sau đó, bạn cần thêm dấu gạch chéo ngược trước dấu ngoặc kép dưới dạng \" trong chuỗi của bạn. Hãy nhớ rằng vẫn phải có dấu ngoặc kép xung quanh toàn bộ chuỗi.

  1. Hãy chạy chương trình để xem kết quả. Chương trình sẽ hiển thị:
Say "hello"

Trong kết quả, có dấu ngoặc kép hiển thị xung quanh hello bởi vì chúng ta đã thêm \" trước và sau hello trong câu lệnh println().

Để biết những dãy ký tự thoát được hỗ trợ trong Kotlin, hãy tham khảo trang tài liệu về dãy ký tự thoát. Ví dụ: nếu bạn muốn một dòng mới trong chuỗi, hãy sử dụng biểu tượng \ trước ký tự n như trong \n.

Giờ đây, bạn đã học về cách nối các chuỗi và dãy ký tự thoát trong chuỗi. Hãy tìm hiểu về kiểu dữ liệu cuối cùng trong lớp học lập trình này.

Boolean

Kiểu dữ liệu Boolean sẽ hữu ích khi biến của bạn chỉ có hai giá trị có thể có được biểu thị bằng true hoặc false.

Ví dụ: biến thể hiện chế độ trên máy bay của thiết bị đang bật hay tắt, thông báo của một ứng dụng đang bật hay tắt.

  1. Hãy nhập mã này vào Kotlin Playground. Ở dòng 2 của chương trình này, bạn khai báo biến Boolean có tên là notificationsEnabled và khởi tạo biến đó với giá trị true. Về mặt kỹ thuật, bạn có thể bỏ qua : Boolean trong khai báo nên bạn có thể xoá phần này nếu muốn. Ở dòng 3 của chương trình, bạn in ra giá trị của biến notificationsEnabled.
fun main() {
    val notificationsEnabled: Boolean = true
    println(notificationsEnabled)
}

Hãy chạy chương trình và kết quả này sẽ được in ra:

true
  1. Thay đổi giá trị ban đầu của Boolean thành false ở dòng 2 của chương trình.
fun main() {
    val notificationsEnabled: Boolean = false
    println(notificationsEnabled)
}

Hãy chạy chương trình và kết quả này sẽ được in ra:

false
  1. Các kiểu dữ liệu khác có thể được nối với Strings. Ví dụ: bạn có thể nối Booleans với Strings. Hãy dùng dấu + để nối (hoặc thêm) giá trị của biến boolean notificationsEnabled vào cuối chuỗi "Are notifications enabled? ".
fun main() {
    val notificationsEnabled: Boolean = false
    println("Are notifications enabled? " + notificationsEnabled)
}

Chạy chương trình để xem kết quả của phép nối. Chương trình sẽ in kết quả này:

Are notifications enabled? false

Có thể thấy rằng bạn có thể đặt biến Boolean thành giá trị true hoặc false. Biến Boolean cho phép bạn viết mã cho các trường hợp thú vị hơn, trong các trường hợp đó bạn thực thi một số tập lệnh khi biến Boolean có giá trị true. Hoặc nếu Boolean có giá trị false, bạn sẽ bỏ qua các lệnh đó. Bạn có thể tìm hiểu thêm về Booleans trong lớp học lập trình sau này.

6. Quy ước lập trình

Trong lớp học lập trình trước đây, bạn đã học về Hướng dẫn về quy tắc lập trình bằng Kotlin để viết mã Android một cách nhất quán theo đề xuất của Google cũng như tuân theo các nhà phát triển chuyên nghiệp khác.

Dưới đây là một số quy ước về định dạng và lập trình khác để bạn thực hiện dựa trên các chủ đề mới tìm hiểu:

  • Tên biến phải tuân theo quy tắc viết hoa Camel và bắt đầu bằng một chữ cái viết thường.
  • Khi khai báo biến, cần có dấu cách sau dấu hai chấm khi chỉ định kiểu dữ liệu.

Sơ đồ này hiển thị dòng mã: val discount: Double = .20 Có một mũi tên chỉ vào khoảng trống có nhãn space giữa dấu hai chấm và kiểu dữ liệu Double.

  • Phải có dấu cách trước và sau toán tử như toán tử gán(=), phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/) ) và nhiều toán tử khác.

Sơ đồ này hiển thị dòng mã: var Pet = "bird" Có các mũi tên chỉ đến dấu cách với nhãn space trước và sau dấu bằng.

Sơ đồ này cho thấy dòng mã cho biết: val sum = 1 + 2 Có các mũi tên chỉ vào khoảng trống trước và sau dấu cộng, với nhãn có ghi khoảng trắng.

  • Khi viết chương trình phức tạp hơn, bạn sẽ thấy giới hạn 100 ký tự mỗi dòng. Nhờ đó, bạn có thể dễ dàng đọc tất cả mã trong chương trình trên màn hình máy tính mà không cần phải cuộn sang ngang khi đọc mã.

7. Để lại ghi chú trong mã của bạn

Khi viết mã, có một phương pháp hay khác mà bạn nên làm theo là thêm ghi chú để mô tả chức năng của mã. Ghi chú có thể giúp người đọc hiểu mã dễ dàng hơn. Hai dấu gạch chéo lên (//) cho biết phần văn bản còn lại trên dòng là một ghi chú. Vì vậy, phần văn bản không bị hiểu nhầm là mã. Thường thì bạn nên thêm dấu cách sau hai dấu gạch chéo lên.

// This is a comment.

Ghi chú cũng có thể bắt đầu ở giữa dòng mã. Trong ví dụ này, height = 1 là một câu lệnh lập trình thông thường. Mọi nội dung sau // hoặc Assume the height is 1 to start with được hiểu là một ghi chú và không được xem là một phần của mã.

height = 1 // Assume the height is 1 to start with.

Nếu bạn muốn mô tả chi tiết hơn về mã bằng ghi chú dài quá 100 ký tự trên một dòng, hãy ghi chú nhiều dòng. Bắt đầu ghi chú có nhiều dòng với dấu gạch chéo lên (/) và dấu hoa thị (*) như sau: /*. Thêm một dấu hoa thị ở đầu mỗi dòng ghi chú tiếp sau. Cuối cùng, hãy kết thúc ghi chú đó bằng dấu hoa thị và dấu gạch chéo lên */.

/*
 * This is a very long comment that can
 * take up multiple lines.
 */

Chương trình này có các ghi chú một dòng và nhiều dòng mô tả những gì đang diễn ra:

/**
 * This program displays the number of messages
 * in the user's inbox.
 */
fun main() {
    // Create a variable for the number of unread messages.
    var count = 10
    println("You have $count unread messages.")

    // Decrease the number of messages by 1.
    count--
    println("You have $count unread messages.")
}

Như đã đề cập ở trên, bạn có thể thêm các dòng trống vào mã để nhóm các câu lệnh liên quan lại với nhau để làm cho mã dễ đọc hơn.

  1. Thêm một số ghi chú vào đoạn mã cũ mà bạn đã sử dụng.
  2. Chạy chương trình để đảm bảo rằng hành vi không thay đổi vì ghi chú không nên ảnh hưởng đến kết quả.

8. Kết luận

Tuyệt vời! Bạn đã tìm hiểu về các biến trong Kotlin, lý do biến lại hữu ích trong quá trình lập trình, cũng như cách tạo, cập nhật và sử dụng các biến đó. Bạn đã thử nghiệm với các kiểu dữ liệu cơ bản khác nhau trong Kotlin, bao gồm kiểu dữ liệu Int, Double, StringBoolean. Bạn cũng đã tìm hiểu về sự khác biệt giữa từ khoá valvar.

Tất cả khái niệm này đều là nền tảng quan trọng trên hành trình trở thành nhà phát triển.

Hẹn gặp bạn trong lớp học lập trình tiếp theo!

Tóm tắt

  • Biến là một vùng chứa dữ liệu.
  • Bạn phải khai báo biến trước khi sử dụng biến đó.
  • Hãy dùng từ khoá val để định nghĩa biến chỉ có thể đọc khi biến không thể thay đổi giá trị sau khi gán.
  • Hãy dùng từ khoá var để định nghĩa một biến có thể thay đổi hoặc chỉnh sửa.
  • Trong Kotlin, bạn nên dùng val thay vì var khi có thể.
  • Để khai báo biến, hãy bắt đầu bằng từ khoá val hoặc var. Sau đó hãy chỉ định tên biến, kiểu dữ liệu và giá trị ban đầu. Ví dụ: val count: Int = 2.
  • Với suy luận kiểu dữ liệu, bạn có thể bỏ qua kiểu dữ liệu trong khai báo biến nếu đã cung cấp giá trị ban đầu.
  • Một số kiểu dữ liệu Kotlin cơ bản phổ biến bao gồm: Int, String, Boolean, FloatDouble.
  • Hãy dùng toán tử gán (=) để gán giá trị cho một biến trong quá trình khai báo biến hoặc cập nhật biến.
  • Bạn chỉ có thể cập nhật một biến đã được khai báo là biến có thể thay đổi (bằng var).
  • Sử dụng toán tử tăng (++) hoặc toán tử giảm (--) để tăng hoặc giảm giá trị của biến số nguyên thêm 1.
  • Sử dụng biểu tượng + để nối các chuỗi với nhau. Bạn cũng có thể nối các biến thuộc các kiểu dữ liệu khác như IntBoolean với Strings.

Tìm hiểu thêm