GIỚI THIỆU NGÔN NGỮ KOTLIN
Giới thiệu
Kotlin là một ngôn ngữ lập trình đã được Google lựa chọn làm ngôn ngữ chính thức cho phát triển ứng dụng Android
Kotlin có nhiều ưu điểm
Kotlin hoàn toàn tương thích với 100% thư viện từ JVM, cho phép lập trình viên dễ dàng gọi Java từ Kotlin và ngược lại Điều này giúp giảm lo lắng về việc chuyển đổi mã nguồn, đồng thời nâng cao khả năng tương tác trong hệ thống.
Kotlin hỗ trợ lập trình trên nhiều công cụ như Website, Eclipse, Netbeans, Android Studio và JetBrains Tài liệu lập trình phong phú cùng với cộng đồng hỗ trợ ngày càng phát triển giúp người dùng dễ dàng tiếp cận và sử dụng ngôn ngữ này.
Môi trường lập trình Kotlin
Để lập trình được Kotlin các bạn có thể sử dụng Website để thử nghiệm online https://try.kotlinlang.org/
Cũng có thể cài đặt phần mềm IntelliJ IDEA, Eclipse Neon, Command Line
Compiler, Build Tools (Ant, Maven, Gradle, Griffon (external support))
Tải bản Community của IntelliJ IDEA tại link sau: http://www.jetbrains.com/idea/download/index.html
Sau đó tiến hành cài đặt như chương trình bình thường Sau khi cài đặt thành công, ta có giao diện thông báo như dưới đây
Để hoàn tất quá trình cài đặt, bạn chỉ cần nhấn nút Finish Nếu muốn khởi động ngay phần mềm, hãy tích chọn “Run IntelliJ IDEA Community Edition” Sau khi cài đặt xong, bạn sẽ thấy biểu tượng shortcut trên màn hình Desktop để dễ dàng truy cập Nếu đây là lần đầu bạn mở phần mềm, một cửa sổ hướng dẫn sẽ xuất hiện.
Chọn Do not import settings rồi bấm OK, màn hình yêu cầu thiết lập Theme cho công cụ xuất hiện:
Chọn cái nào cũng được, tùy sở thích Dưới đây là màn hình sau khi đã cấu hình xong IntelliJ IDEA, các lần sau khởi động sẽtương tự
Ứng dụng đầu tiên
Sau khi bấm Create New Project, màn New Project xuất hiện:
Trên màn hình New Project, hãy chú ý góc phải trên cùng có nút “New” bên cạnh Project SDK Đây là nơi để chọn đường dẫn cài đặt JDK; bạn cần nhấn vào nút này để chỉ định đúng vị trí cài đặt (nên sử dụng JDK từ phiên bản 1.8 trở lên) Trong danh sách bên dưới, hãy chọn Kotlin (Java) Sau khi cấu hình xong, bạn sẽ thấy giao diện tương tự như hình dưới đây.
Bạn thấy đó, ở trên JDK đã được update, tiếp theo bạn bấm Next :
Mục Project name: Tên của dự án, bạn đặt “HelloWorld”
Mục Project Location: Nơi lưu trữ dự án, bạn trỏ tới thư mục mà bạn muốn lưu trữ.
Sau đó bấm Finish để tạo Project HelloWorld Nếu chương trình kiểm tra thấy đường dẫn chưa tồn tại thì sẽ xuất hiển cửa sổ xác nhận để tạo:
Ta bấm OK để đồng ý tạo đường dẫn lưu Project HelloWorld Đây là màn hình cấu trúc Project Kotlin được tạo ra:
–Thư mục idea cho ta các tập tin cấu hình, tham chiếu thư viện.
– Thư mục src là nơi lưu trữ các tập tin, lớp source code cho dự án
– File HelloWorld.iml bản chất là một file XML, được lưu các thông số cấu hình mặc định cho dự án
– External Libraries: Thư viện liên kết ngoài: Bắt buộc phải có JDK,
KotlinJavaRuntime, các thư viện này sẽ được tham chiếu trong tập tin
KotlinJavaRuntime.xml Để tạo một Mã nguồn bằng Kotlin ta tiến hành: Bấm chuột phải vào thư mục src/ chọn New/ chọn Kotlin File/Class:
Màn hình yêu cầu tạo Kotlin File xuất hiện như dưới đầy:
Mục Name: Bạn đặt tên tùy ý, ví dụ Tui đặt là app
Mục Kind: Chọn File(bài này sẽ chọn File, các bài sau tùy trường hợp mà ta chọn các loại khác trong combobox)
Nhấn OK để tạo, ta thấy cấu trúc source code sẽ như sau:
Như vậy, phần mở rộng của Kotlin là `.kt` Chúng ta sẽ tiến hành lập trình để hiển thị thông báo "Hello World! I’m http://ssoftinc.com/".
Trong màn hình soạn thảo của app.kt, chỉ cần gõ từ khóa "main" và nhấn tổ hợp phím Ctrl + Space, hàm main sẽ tự động xuất hiện đầy đủ.
Khi bạn nhấn Ctrl+Space, một dòng màu xanh với chữ "main() function" sẽ xuất hiện; chỉ cần nhấn Enter để tự động hoàn thành lệnh đầy đủ Những dòng này được gọi là Template, không có gì phức tạp và có thể tự cấu hình Cấu trúc hàm main bao gồm từ khóa "fun" (function) và chứa các arguments, thường được sử dụng để truyền thông tin đầu vào khi chạy mã lệnh.
16 số gọiqua lại giữa các ứng dụng khác nhau) Bạn muốn xuât dòng lệnh thông báo ra màn hình thì viết bên trong hàm main, ví dụ:
Bạn quan sát nó có gì lạ với Java? kết thúc câu lệnh không phải gõ chấm phẩy đúng không?
Để chạy đoạn lệnh này, bạn có thể vào menu Run/Run hoặc nhấp chuột phải vào file app.kt và chọn "Run App.kt" như hình dưới đây.
Bạn chờ chương trình biên dịch và chạy ra kết quả như dưới đây:
Viết chương trình in ra màn hình họ và tên của chính mình
Viết chương trình in ra màn hình thông tin của bản thân như mẫu sau:
Những trọng tâm cần chú ý trong bài:
- Trình bày được khái niệm ngôn ngữ Kotlin
- Cài đặt được môi trường lập trình Kotlin
- Viết được ứng dụng đầu tiên của Kotlin
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày được khái niệm ngôn ngữ Kotlin
+ Về kỹnăng: Cài đặt được môi trường lập trình Kotlin
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp
+ Về kỹnăng:Viết được ứng dụng đầu tiên của Kotlin
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
BIẾN, KIỂU DỮ LIỆU VÀ NHẬP XUẤT VỚI KOTLIN
Các kiểu dữ liệu của Kotlin
Mỗi ngôn ngữ lập trình, bao gồm cả Kotlin, đều cung cấp các kiểu dữ liệu để lưu trữ và xử lý thông tin, như số thực, số nguyên, ký tự, chuỗi, luận lý và mảng Tất cả các kiểu dữ liệu trong Kotlin đều mang tính chất hướng đối tượng Hiểu rõ ý nghĩa của từng kiểu dữ liệu sẽ giúp lập trình viên lựa chọn cách khai báo biến phù hợp, từ đó tối ưu hóa hệ thống.
Các kiểu dữ liệu được xây dựng sẵn trong Kotlin:
Số thực được chia thành hai loại chính là Double và Float Để xác định loại số thực, bạn có thể thêm ký tự 'f' hoặc 'F' sau hằng số Ví dụ, 113.5 được coi là số Double, trong khi 113.5F hoặc 113.5f là số Float.
Số nguyên được chia thành 4 loại: Long, Int, Short và Byte Đối với hằng số của Long và Int, cần thêm ký tự L; ví dụ, 113 là số Int, trong khi 113L là số Long (không sử dụng l thường).
Khai báo biến và ép kiểu
Ta có thể khai báo biến cho các kiểu dữ liệu này như sau: var tên_biến : Kiểu_Dữ_Liệu=Giá_Trị_Mặc_Định ví dụ:
6 var x:Long0L var y:Double3.5 var f:Float3.5f var i:Int 3 var s:Short=8 var b:Byte=1
Ta để ý với Kotlin thì không cần thêm dấu chấm phẩy khi kết thúc lệnh
Kiểu ký tự dùng để lưu trữ một ký tự nằm trong nháy đơn:
Kiểu chuỗi dùng để lưu tập các ký tự được để trong cặp nháy đôi, dùng đối tượng String để khai báo:
1 var ten:String="Nguyễn Văn A"
Bạn có thể khai báo chuỗi trên nhiều dòng bằng cách sử dụng cặp ba dấu nháy kép Ví dụ trong hàm main, bạn có thể khai báo biến tên là "Nguyễn Văn A" và địa chỉ là một chuỗi nhiều dòng: "số 24 đường 7, khu phố X, phường 5, Quận 9".
Kiểu dữ liệu Boolean được sử dụng để khai báo các đối tượng với hai giá trị là true hoặc false Đây là một kiểu dữ liệu quan trọng, thường được áp dụng trong việc kiểm tra các điều kiện trong lập trình.
Trong quá trình tính toán đôi khi kết quả trả về không còn giống với kiểu dữ liệu chỉ định ban đầu nên ta cần ép kiểu
Khi ép kiểu thường ta gặp 2 trường hợp:
- Ép kiểu rộng Đưa từ kiểu có vùng lưu trữ nhỏ lên kiểu có vùng lưu trữ lớn==>không sợ mất mát dữ liệu
Ví dụ: Byte=>Short=>Int=>Long=>Float=>Double
- Ép kiểu hẹp Đưa từ kiểu có vùng lưu trữ lớn về kiểu có vùng lưu trữ nhỏ==>có thể bị mất mát dữ liệu
Ví dụ: Double=>Float=>Long=>Int=>Short=>Byte
Trong Kotlin, bất kỳ kiểu dữ liệu number nào cũng có sẵn các phương thức :
Các phương thức này được gọi là ép kiểu tường minh, hay còn được biết đến với tên tiếng Anh là Explicit Conversion, vì chúng chỉ định rõ kiểu dữ liệu nào sẽ được ép về.
Ta thử chạy đoạn ép kiểu sau:
5 var X:Int var D:Double=X.toDouble() println("X="+X) println("D="+D)
Kết quả X , và D là 10.0 vì 10 được đưa về số Double là 10.0
Trường hợp này là ép kiểu rộng ==> Đưa từ kiểu có vùng lưu trữ nhỏ hơn lên kiểu dữ liệu có vùng lưu trữ lớn hơn
Nhập dữ liệu từ bàn phím
Với Kotlin, để nhập dữ liệu từ bàn phím ta dùng hàm readLine(), hàm này nằm trong thư viện mặc định kotlin.io
Hàm readLine() sẽtrả về một chuỗi dữ liệu được nhập vào từ bàn phímhoặc là giá trị null nếu như không có dữ liệu.
Từ chuỗi kết quả này, chúng ta có thể chuyển đổi kiểu dữ liệu thành bất kỳ loại nào mà chúng ta mong muốn, phù hợp với giá trị nhập vào.
Ví dụ để nhập một chuỗi: fun main(args: Array) { println("Tên của bạn là gì?:") var ten:String?= readLine() println("Bạn nhập tên:") println(ten)
Xuất dữ liệu
Trong Kotlin để xuất dữ liệu ra màn hình ta dùng 2 hàm chính đó là print() và println() Hai hàm này thuộc thư viện kotlin.io
Hàm println() dùng để xuất dữ liệu trên các dòng khác nhau, ví dụ: println("Obama") println("Putin") println("Kim Jong Un")
Ngoài ra Kotlin cũng cung cấp một số ký tự đặc biệt để ta điều hướng cách thức hiển thị dữ liệu, chẳng hạn như:
Viết chương trình in in ra màn hình 5 số lẻ từ1 đến 10, mỗi sốđều xuống dòng
Viết chương trình cho phép người dùng nhập hai sốA và B Sau đó thực hiện 4 phép toán cơ bản trên 2 sốđó là cộng trừ nhân chia
Những trọng tâm cần chú ý trong bài:
- Trình bày được các kiểu dữ liệu của Kotlin
- Khai báo được biến và ép kiểu
- Viết được ứng dụng nhập dữ liệu từ bàn phím
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày được các kiểu dữ liệu của Kotlin
+ Về kỹnăng: Viết được ứng dụng nhập dữ liệu từ bàn phím
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp + Về kỹ năng:Viết được ứng dụng nhập dữ liệu từ bàn phím
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
LỆNH CÓ CẤU TRÚC
Lệnh điều khiển If - Else
Trong Kotlin, câu lệnh if và else không chỉ đơn thuần là cấu trúc điều kiện truyền thống mà còn hoạt động như một biểu thức có khả năng trả về giá trị, điều này tạo ra sự thú vị trong việc lập trình.
Ta vào cấu trúc if truyền thống, cú pháp: if ( )
Cấu trúc if ở trên chỉ quan tâm tới điều kiện đúng, khi trong if đúng thì sẽ thực hiện các lệnh ở bên trong if.
Ví dụ, kiểm tra điểm Trung bình >=5 thì ghi đậu: fun main(args: Array) { var dtb:Double=8.0; if(dtb>=5)
Ta vào cấu trúc if và else truyền thống, cú pháp: if (< expression > )
The if-else structure focuses on evaluating conditions as true or false If the is true, the content of within the if block will be executed; otherwise, if the is false, the corresponding content will be executed in the else block.
của else sẽ được thực hiện Đây là một trong những cấu trúc phổ biến nhất được sử dụng rất nhiều trong quá trình kiểm tra điều kiện
Ví dụ, kiểm trađiểm Trung bình >=5 thì ghi đậu, =5)
Ta có thể lồng ghép các if else vào với nhau:
To check if a student's average score falls within the passing range, you can use the following Kotlin code: In the main function, prompt the user to enter their average score (from 0 to 10) and store it as a Double variable Utilize the readLine() function to capture the input, ensuring to handle any null values appropriately for accurate evaluation.
{ dtb=s.toDouble() if(dtb>=0 && dtb= 5)
{ println("Thím phải nhập điểm [0 10]")
Trong bài viết này, chúng ta đã tìm hiểu về cách tiếp cận if else theo phương pháp truyền thống như một biểu thức điều kiện Bây giờ, tôi sẽ giới thiệu một điểm mới trong Kotlin: if else hoạt động như một biểu thức trả về kết quả.
Ví dụ: cho 2 số a và b, tìm số lớn nhất:
Cách viết theo biểu thức Cách viết truyền thống fun main(args: Array) { var a:Int var b:Int var max:Int max=if (a>b) a else b println("Số lớn nhất ="+max)
} fun main(args: Array) { var a:Int var b:Int var max:Int if(a>b) max=a else max=b
27 println("Số lớn nhất ="+max) }
Chú ý khi viết if với dạng biểu thức trả về kết quả thì bắt buộc phải có else
Biểu thức if else trong Kotlin cho phép sử dụng dạng block lệnh với dấu ngoặc nhọn {} Dòng lệnh cuối cùng trong mỗi block sẽ là kết quả trả về Ví dụ, trong hàm main, ta có thể khai báo hai biến a và b, và sử dụng biểu thức if để xác định biến lớn hơn, với kết quả được in ra và trả về giá trị của biến đó.
} Đoạn lệnh trên khi chạy sẽ ra kết quả:
Giá trị a ở cuối if, giá trị b ở cuối else là kết quả trả về và gán vào cho biến max.
Lệnh điều khiển When
Với Kotlin, biểu thức switch đã được thay thế bằng biểu thức when, mang lại sức mạnh và tính đa năng cho lập trình viên Bài viết này cung cấp 6 ví dụ chi tiết, giúp bạn hiểu rõ cách thức hoạt động của when và áp dụng hiệu quả vào các bài toán thực tế phức tạp hơn.
Cú pháp tổng quát của when: when(){
-> else ->
When retrieving a value from an , it is compared against various options If there is a match with any , the corresponding will be executed If none of the options match the , the else clause will be executed.
Lưu đồ của when có thể được hoạt động như hình dưới đây:
Ví dụ 1: fun main(args: Array) { var value:Int=2 when(value)
3->println("Hello Kim Jong Un") else-> println("Hello Everyone!")
Khi chạy đoạn coding trên thì dòng “Helo Putin” sẽ được xuất ra màn hình.
Lệnh vòng lặp
Loại for thứ 1 – Duyệt tuần tự hết giá trị trong danh sách (closed range) for (i in a b)
Biến i trong cú pháp trên thực chất là biến bước nhảy, tự động tăng dần từ a đến b Bạn có thể thay thế tên biến i bằng bất kỳ tên biến nào khác.
Ví dụ 1:Viết chương trình tính giai thừa của một số nguyên dương n: fun main(args: Array) { var gt:Int=1 val n:Int=5 for (i in 1 n)
Loại for thứ 2 – Duyệt tuần tự gần hết giá trị trong danh sách (half-open range) for (i in a until b)
Biến i trong cú pháp trên thực chất là biến bước nhảy, tự động tăng dần từ a đến gần b Chúng ta có thể thay đổi tên biến i thành bất kỳ tên biến nào khác.
Loại for thứ 3–Điều hướng bước nhảy step
Biến i trong cú pháp trên thực chất là biến bước nhảy, tự động tăng từ a đến b với mỗi lần duyệt tăng theo x đơn vị Bạn có thể thay đổi tên biến i thành bất kỳ tên nào khác.
Loại for thứ 4–Điều hướng bước nhảy downTo for (i in b downTo a)
Với cú pháp đã nêu, biến i thực chất là biến bước nhảy, tự động giảm từ b xuống a, với mỗi lần lặp giảm 1 đơn vị Bạn có thể thay đổi tên biến i thành bất kỳ tên nào khác hoặc sử dụng cú pháp for (i in b downTo a step x).
Loại for thứ 5 –Lặp tập đối tượng for (item in collection)
Cấu trúc for trên sẽ duyệt từng đối tượng trong một tập đối tượng
3.2 WHILE Đây cũng là một trong những cấu trúc lặp khá phổ biến trong các ngôn ngữ lập trình không riêng gì Kotlin, cú pháp: while(expression)
B2: Nếu kết quả là true thì statement thực thi và quay lại B1
B3: Nếu kết quả là false thì thoát khỏi vòng lặp while Để thoát vòng lặp: dùng break Để di chuyển sớm qua lần lặp tiếp theo : dùng continue
Lưu ý:Lệnh trong while có thể không được thực hiện lần nào do ngay từ đầu expression không thỏa
Cú pháp vòng lặp do…while: do
−Nếu expression là true thì quay lại bước 1
−Nếu expression là false thì thoát khỏi vòng lặp. Để thoát vòng lặp: dùng break Để di chuyển sớm qua lần lặp tiếp theo : dùng continue
Lưu ý:Lệnh trong do…while chắc chắn được thực hiện ít nhất một lần.
Lệnh xử lý ngoại lệ
Khi lập trình thường chúng ta gặp 3 cấp độ lỗi:
Lỗi logic exception – sai nghiệp vụ yêu cầu
Khi gặp lỗi trong lập trình, có hai cách tiếp cận: không quan tâm (Unchecked error) và quan tâm (Checked error) Để trở thành lập trình viên chuyên nghiệp, chúng ta cần chú ý đến những lỗi này và thực hiện kiểm tra cẩn thận Việc này giúp đảm bảo rằng chương trình vẫn tiếp tục hoạt động mà không bị dừng lại khi gặp sự cố.
Kotlin hỗ trợ chúng ta cú pháp tổng quát để xử lý biệt lệ như sau: try {
// viết lệnh ở đây và các lệnh này có khả năng sinh ra lỗi
// handler lỗi ở đây -> thông báo lỗi chi tiết để biết mà sửa cái gì
// optional finally block –cho dù có lỗi hay không có lỗi xảy ra thì block luôn luôn thực hiện
Viết chương trình tìm số lớn nhất trong 2 số A, B Với A và B nhập từ bàn phím
Viết chương trình đổi 1 só thập phân nhập từ bàn phím sang nhị phân
Những trọng tâm cần chú ý trong bài:
Trình bày được cấu trúc lệnh If-Else và When
Trình bày được cấu trúc lệnh vòng lặp
Viết được ứng dụng có dùng lệnh điều khiển và vòng lặp
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày được cấu trúc lệnh If-Else và When, vòng lặp
+ Về kỹnăng: Viết được ứng dụng có dùng lệnh điều khiển và vòng lặp
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
Kiến thức được đánh giá thông qua các hình thức kiểm tra như viết, trắc nghiệm và vấn đáp Về kỹ năng, người học cần có khả năng viết ứng dụng sử dụng lệnh điều khiển và vòng lặp.
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc.
MẢNG, CHUỖI VÀ COLLECTION
Mảng
Để khai báo và cấp phát mảng ta làm như sau: var M:IntArray= IntArray(n)
Với n là số phần tử lưu trữ tối đa của mảng.
Mảng M là một cấu trúc lưu trữ chứa các kiểu dữ liệu Int, với khả năng lưu tối đa n phần tử, và có thể được xem như một đối tượng kiểu IntArray Giống như các ngôn ngữ lập trình khác, mảng này sử dụng chỉ số bắt đầu từ 0, cho phép người dùng truy xuất các phần tử thông qua chỉ số tương ứng.
Khi làm việc với mảng trong Kotlin, việc truy xuất phần tử chỉ là một chức năng nhỏ trong số nhiều phương thức phong phú mà nó cung cấp Mảng trong Kotlin là một đối tượng mạnh mẽ với nhiều phương thức xử lý hiệu quả, bao gồm tìm giá trị nhỏ nhất, lớn nhất, tính trung bình, tổng, tìm kiếm và sắp xếp.
Mảng trong lập trình có nhiều thuộc tính và phương thức quan trọng, bao gồm độ dài của mảng, khả năng thêm, xóa và tìm kiếm phần tử Một số phương thức thường dùng như push() để thêm phần tử vào cuối mảng, pop() để xóa phần tử cuối, shift() và unshift() để xử lý phần tử ở đầu mảng, cùng với các phương thức như splice() và slice() để thao tác với các phần tử trong mảng Việc nắm vững các thuộc tính và phương thức này sẽ giúp lập trình viên quản lý và xử lý mảng hiệu quả hơn trong các ứng dụng của mình.
Tên Thuộc tính/phương thức Mô tả size Thuộc tính trả vềkích thước thực sự của mảng
Indexer cho phép truy xuất và thay đổi giá trị tại vị trí i của mảng Hàm count{} đếm số lượng phần tử, trong khi min() và max() lần lượt trả về giá trị nhỏ nhất và lớn nhất trong mảng Hàm sum() tính tổng các phần tử, average() tính giá trị trung bình, và sort() sắp xếp mảng theo thứ tự tăng dần Đối với sắp xếp giảm dần, sử dụng sortDescending() Hàm filter{} giúp tìm kiếm và lọc danh sách trong mảng, reverse() đảo ngược thứ tự của mảng, và contains() kiểm tra xem mảng có chứa một phần tử cụ thể hay không.
Chuỗi
Để khaibáo chuỗi trong Kotlin ta dùng: var s:String=”Obama” hoặc var s:String?=”Putin”
Trong Kotlin, chuỗi có nhiều thuộc tính và phương thức hữu ích Dưới đây là một số phương thức quan trọng mà bạn có thể sử dụng để thao tác với chuỗi.
Tên Thuộc tính/ phương thức Mô tả
Thuộc tính `length` trả về chiều dài của chuỗi Phương thức `indexOf(chuỗi)` tìm vị trí đầu tiên của chuỗi, trả về -1 nếu không tìm thấy `lastIndexOf(chuỗi)` trả về vị trí cuối cùng của chuỗi được tìm thấy Phương thức `contains(chuỗi con)` kiểm tra xem chuỗi con có nằm trong chuỗi chính hay không `subString(vt)` trích xuất toàn bộ phần bên phải chuỗi từ vị trí vt, trong khi `subString(startIndex, endIndex)` trích xuất phần chuỗi nằm giữa hai chỉ số start và end Phương thức `replace(chuỗi cũ, chuỗi mới)` thay thế toàn bộ chuỗi cũ bằng chuỗi mới, và `replaceFirst(chuỗi cũ, chuỗi mới)` chỉ thay thế chuỗi cũ đầu tiên Các phương thức `trimStart`, `trimEnd`, và `trim` lần lượt xóa khoảng trắng dư thừa bên trái, bên phải, và cả hai bên của chuỗi Cuối cùng, `compareTo(chuỗi s2)` so sánh hai chuỗi.
So sánh 2 chuỗi có phân biệt chữ HOA và chữthường
So sánh 2 chuỗi KHÔNG phân biệt chữ HOA và chữthường
38 plus(chuỗi x) Nối chuỗi x vào chuỗi gốc split(chuỗi tách) Tách chuỗi gốc thành List toUpperCase Chuyển chuỗi thành IN HOA toLowerCase Chuyển chuỗi thàh in thường
Collection
Không giống như các ngôn ngữ lập trình khác, Kotlin phân biệt rõ 2 loại Collections(Mutable collections và Immutable collections)
Mô hình lớp kế thừa của các Collection trong Kotlin/java:
Mutable Collections là tập các lớp dùng để lưu trữ danh sách dữ liệu và có thểthay đổi kích thước được
Immutable Collections là tập các lớp dùng để lưu trữ danh sách dữ liệu và không thểthay đổi kích thước được
Cả 2 loại Collections này rất dễ tạo và sử dụng, chỉ khác nhau chút xíu ở mục đích sử dụng của lập trình viên.
Trong giới hạn bài học này chỉ trình bày về MutableList và List, các lớp Collection khác các bạn tự tìm hiểu thêm nếu trong dự án có gặp
MutableList Là collection có thể thay đổi kích thước dữ liệu: Có thể thêm, sửa, xóa…
List là một collection chỉ có chức năng readOnly, được sử dụng để hiển thị thông tin một cách hiệu quả Với khả năng tối ưu bộ nhớ tốt hơn so với MutableList, List là sự lựa chọn lý tưởng nếu bạn chỉ cần hiển thị dữ liệu mà không cần thay đổi nội dung.
Các collection trong Kotlin không có các Constructor khởi tạo riêng, mà nó thông qua các hàm mutableListOf(), listOf() để khởi tạo
Ví dụ 1 dưới đây mình họa cách khởi tạo 2 collections:
2 var ds1:MutableList =mutableListOf() var ds2:List = listOf() Ở trên 2 đối tượng ds1 và ds2 được khởi tạo với danh sách rỗng.
Ta có thể khởi tạo với một số dữ liệu ban đầu,
Trong đoạn mã trên, ds1 được khởi tạo là một MutableList với 5 phần tử, cho phép thay đổi thông tin và kích thước Ngược lại, ds2 là một List với 4 phần tử, không cho phép thay đổi thông tin và kích thước Việc sử dụng List cho thấy rằng người dùng mong muốn dữ liệu chỉ được hiển thị mà không cần chỉnh sửa.
Dưới đây là một số phương thức thường dùng với MutableList/List:
Tên Thuộc tính/phương thức Mô tả size Thuộc tính trả về kích thước thực sự của
The Indexer allows for accessing and modifying values at a specific position i within a collection Key functions include add() for adding a single element, addAll() for adding multiple elements, removeAt() for deleting an element at a specified index, and remove() for deleting an object from the collection.
The methods for managing collections include removeIf{} for conditional removal, clear() for deleting the entire list, sort() for ascending order sorting, sortDescending() for descending order sorting, and filter{} for data filtering Additionally, contains() checks whether a collection includes a specific element.
Viết chương trình để nhập vào hai số nguyên dương, sau đó chuyển đổi chúng sang dạng nhị phân và lưu trữ vào mảng Tiếp theo, thực hiện phép cộng nhị phân trên hai mảng chứa số nhị phân đã lưu.
Viết chương trình nhập vào họ tên của một người Sau đó đảo chữ trong tên đó
Ví dụ: Nhập là Nguyen Van A -> Xuất là A Van Nguyen
Những trọng tâm cần chú ý trong bài:
- Trình bày cấu trúc mảng trong ngôn ngữ Kotlin
- Trình bày cấu trúc chuỗi trong ngôn ngữ Kotlin
- Trình bày cấu trúc collection trong ngôn ngữ Kotlin
- Viết được ứng dụng có dùng mảng, chuỗi và collection
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày cấu trúc mảng, chuỗi, collection trong ngôn ngữ Kotlin
+ Về kỹnăng: Viết được ứng dụng có dùng mảng, chuỗi và collection
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp + Về kỹ năng:Viết được ứng dụng có dùng mảng, chuỗi và collection
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc.
HÀM
Giá trị trong Kotlin
Trong nhiều ngôn ngữ lập trình, có những câu lệnh không mang lại giá trị thực Tuy nhiên, trong Kotlin, hầu hết mọi thứ đều được xem như một biểu thức và đều có giá trị, ngay cả khi giá trị đó chỉ là kotlin.Unit.
Các vòng lặp như for và while không có giá trị hợp lý, vì vậy chúng không thể được gán giá trị Nếu bạn cố gắng gán giá trị của vòng lặp cho một biến nào đó, trình biên dịch sẽ phát sinh lỗi.
Hàm trong Kotlin
Khai báo hàm trong Kotlin có cá dạng sau: fun tên hàm() {
} fun tên hàm() : Kiểu trả về{ return biến hoặc giá trị //
} fun tên hàm(Kiểu : biến) {
} fun tên hàm(Kiểu : biến = “giá trị mặc định”) {
Viết chương trình nhập vào 2 số A và B Tiến hành tạo các hàm “Cộng”, “Trừ”,
“Nhân”, “Chia” để tính 2 số mới nhập
Viết chương trình tính giai thừa của một số nhập từ bàn phím dùng phương pháp đệ qui
Những trọng tâm cần chú ý trong bài:
Trình bày được các loại giá trị trong Kotlin
Tạo được hàm trong Kotlin
Viết được ứng dụng có dùng hàm trong Kotlin
Thực hiện các thao tác an toàn với máy tính
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày được các loại giá trị trong Kotlin
+ Về kỹ năng: Viết được ứng dụng có dùng hàm trong Kotlin
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp
+ Về kỹnăng:Viết được ứng dụng có dùng hàm trong Kotlin
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc.
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Tạo lớp với Kotlin
Kotlin hỗ trợ lập trình hướng đối tượng (OOP), một khái niệm chung trong lập trình Nếu bạn đã nắm vững OOP, bạn có thể áp dụng kiến thức này cho nhiều ngôn ngữ khác như C++, C#, Java, PHP, Python, R, GO, và nhiều ngôn ngữ khác Mặc dù tất cả đều sử dụng OOP, nhưng kỹ thuật triển khai OOP của từng ngôn ngữ có sự khác biệt.
Khai báo Tên Lớp trong Kotlin:
Với Kotlin, để tạo một lớp ta dùng từ khóa class giống như các ngôn ngữ lập trình khác: class SinhVien {
Kotlin cho phép khai báo lớp chỉ với tên lớp mà không cần các thành phần khác, ví dụ như sau: class SinhVien.
Tên lớp ta nên đặt theo quy tắc: Ký Tự Đầu Tiên của các Từ phải Viết Hoa, không chứa khoảng trắng…
Kotlin hỗ trợ hai loại constructors, bao gồm primary constructor và secondary constructors, để khởi tạo các giá trị ban đầu cho đối tượng khi cấp phát bộ nhớ.
Khai báo primary constructor trong Kotlin: class SinhVien constructor(ma:Int,ten:String){
} Ở trên constructor là từ khóa, bên trong nó có 2 đối số, có nghĩa là Lớp SinhVien này có 1 Primary construtor có 2 đối số.
If the primary constructor does not contain any annotations or modifiers (private, protected, public), the keyword "constructor" can be omitted from the declaration Therefore, a shorthand declaration can be made as follows: class SinhVien(ma: Int, ten: String) {
Primary constructor không thể chứa đoạn mã, do đó để khởi tạo giá trị mặc định cho các biến, cần sử dụng khối lệnh init{} Ví dụ, trong lớp SinhVien, ta có thể viết: class SinhVien(ma: Int, ten: String) { init { println("Đây là primary constructor") println("Mã=$ma ; Tên=$ten") } }.
Khi khai báo biến để sử dụng lớp SinhVien ở trên ta sẽ làm như sau: fun main(args: Array) { var lanh=SinhVien(113,"Trần Thị Long Lanh")
Chạy chương trình, ta được kết quả như sau:
Mã3 ; Tên =Trần Thị Long Lanh
Khi khai báo var lanh=SinhVien(113,”Trần Thị Long Lanh”) nó sẽ tự động tìm tới primary constructor và tự nhảy vào init block để thực hiện
Và chú ý là không cần dùng từ khóa new để xin cấp phát bộ nhớ như C# hay java…
Khai báo secondary constructor trong Kotlin:
Ta cũng dùng từ khóa constructor để khai báo secondary constructor trong kotlin, ví dụ: class SinhVien { constructor()
{ println("Đây là secondary constructor 0 đối số")
} constructor(ma:Int,ten:String)
{ println("Đây là secondary constructor 2 đối số") println("Mã=$ma ; Tên =$ten")
Khai báo sử dụng các secondary constructor: fun main(args: Array) { var teo=SinhVien() var lanh=SinhVien(113,"Trần Thị Long Lanh")
Khi chạy phần mềm ta có các thông báo sau: Đây là secondary constructor 0 đối số Đây là secondary constructor 2 đối số
Mã3 ; Tên =Trần Thị Long Lanh
Khai báo các thuộc tính của Lớp trong Kotlin:
Thuộc tính là các thông tin đặc trưng của một đối tượng, chẳng hạn như sinh viên có các thuộc tính như mã sinh viên, tên và năm sinh Những thông tin này giúp xác định và phân loại đối tượng sinh viên một cách rõ ràng.
Kotlin giống như cácngôn ngữ khác, cung cấp một số các Visibily Modifiers (private, protected, public, default) cho các thuộc tính:
Modifiers Lớp (Class) Gói (Package) Lớp con
(Subclass) Ngoài public Có Có Có Có protected Có Có Có Không
Có Có có Không private Có Không Không Không
Ví dụ: class SinhVien { var ma:Int=0 var ten:String="" constructor()
{ println("Đây là secondary constructor 0 đối số")
} constructor(ma:Int,ten:String)
{ println("Đây là secondary constructor 2 đối số") println("Mã=$ma ; Tên =$ten")
Theo thông tin đã nêu, hai thuộc tính "ma" và "ten" được thiết lập là default Modifier, cho phép các đối tượng trong cùng một package truy cập vào các thuộc tính này.
7 fun main(args: Array) { var teo=SinhVien() teo.ma4 teo.ten="Nguyễn Thị Tèo" println("Thông tin của Tèo:") println("Mã ="+teo.ma) println("Tên="+teo.ten)
Để đảm bảo tính đóng gói trong lập trình, các thuộc tính của lớp nên được khai báo là private Khi thuộc tính được khai báo là private, các đối tượng không thể truy cập trực tiếp vào chúng mà phải sử dụng các phương thức getter và setter để thao tác với giá trị của thuộc tính.
4 class SinhVien { private var ma:Int=0 private var ten:String=""
Khi khai báo Modifier là private, việc truy xuất các thuộc tính của đối tượng sẽ không khả thi, dẫn đến việc báo lỗi nếu khai báo như ví dụ dưới đây.
5 fun main(args: Array) { var teo=SinhVien() teo.ma4 teo.ten="Nguyễn Thị Tèo"
Khai báo các getter/setter của Lớp trong Kotlin:
Khi các thuộc tính trong lớp được thiết lập là mặc định và được truy xuất trong cùng một package, hoặc khi các thuộc tính được khai báo là public, thì không cần thiết phải định nghĩa getter và setter.
Cách khai báo getter/setter trong Kotlin có khác biệt so với Java, C# và các ngôn ngữ khác
Cú pháp tổng quát để khai báo getter/setter: var [: ] [= ]
11 class SinhVien { private var ma:Int=0 private var ten:String="" public var Ma:Int get()
} public var Ten:String get()
{ println("Đây là secondary constructor 0 đối số")
} constructor(ma:Int,ten:String)
{ println("Đây là secondary constructor 2 đối số") println("Mã=$ma ; Tên =$ten")
Trong bài viết, chúng ta có hai Getter/Setter cho các thuộc tính "ma" và "ten" Các đối tượng bên ngoài không thể truy cập trực tiếp vào hai thuộc tính này, mà chỉ có thể truy xuất thông qua hai phương thức Getter/Setter đã được định nghĩa.
Getter/Setter Ma và Ten (chú ý IN HOA- in thường)
Phần mềm IntelliJ IDEA cung cấp gợi ý cho các từ khóa như get và set; chỉ cần gõ ký tự đầu, gợi ý sẽ xuất hiện và bạn chỉ cần nhấn Enter để chèn Đặc biệt, với từ khóa set, bạn cần lưu ý rằng value là tham số mặc định, dùng để nhận giá trị đầu vào từ bên ngoài nhằm thay đổi thông tin cho thuộc tính của đối tượng.
Ví dụ triệu gọi lớp SinhVien:
8 fun main(args: Array) { var hanh=SinhVien() hanh.Ma3 hanh.Ten="Hồ Thị Hạnh" println("Thông tin của Hạnh:") println("Mã:"+hanh.Ma) println("Tên:"+hanh.Ten)
Kết quả khi chạy các đoạn lệnh ở trên: Đây là secondary constructor 0 đối số
Có nhiều tình huống để điều chỉnh cách sử dụng get và set Khi gặp trường hợp cụ thể, bạn nên tìm hiểu thêm, vì không thể trình bày tất cả ở đây.
Khai báo các Phương thức của Lớp trong Kotlin:
Phương thức, hay còn gọi là hành vi, là các xử lý nghiệp vụ được thực hiện trên đối tượng, phản ánh tập hợp các sức mạnh của chúng Trong Kotlin, từ khóa "fun" được sử dụng để khai báo các phương thức, và chúng có thể có giá trị trả về hoặc không.
Ví dụ dưới đây bổ sung 2 phương thức (trả về giá trị String và không trả về giá trị nào cả):
*/ class SinhVien { private var ma:Int=0 private var ten:String="" public var Ma:Int get()
} public var Ten:String get()
{ println("Đây là secondary constructor 0 đối số")
} constructor(ma:Int,ten:String)
{ println("Đây là secondary constructor 2 đối số") println("Mã=$ma ; Tên =$ten")
{ println("Thông tin chi tiết:") println("Mã = "+ma) println("Tên= "+ten)
{ var s="Thông Tin Chi Tiết:" s=s.plus("\nMã="+ma) s=s.plus("\n") s=s.plus("Tên="+ten) return s
Phương thức xuatThongTin() là một thủ tục không trả về giá trị, thực hiện nội tại trong lớp, trong khi phương thức chiTiet() trả về giá trị, cho phép lưu trữ kết quả để sử dụng cho các mục đích khác, rất phổ biến trong lập trình.
Ví dụ dưới đây minh hoạt cách thức sử dụng 2 hàm trên:
Lớp con & kế thừa
Kế thừa là quá trình tái sử dụng mã nguồn cũ, cho phép mở rộng thêm mã lệnh mới từ những thành phần đã tồn tại, từ đó nâng cao hiệu suất lập trình.
Thường các đối tượng có cùng chung một số đặc điểm, hành vi được nhóm lại với nhau.
Xe tải các xe này có một số đặc điểm giống nhau đúng ko?
Ta thường thấy mô hình Lớp kế thừa người ta vẽ giống như dưới đây:
Hay Một lớp con có thể là lớp cha của các lớp khác:
54 Để làm tốt được Kế Thừa thì ta cần biết 2 khái niệm:
Tổng quát hoá:Những đặc điểm chung mà các lớp đều có==>là các lớp Cha
Chuyên biệt hóa: Những đặc điểm riêng chỉ có các lớp con mới có ==>là các lớp Con
Ví dụ: Công ty có 2 loại nhân viên (Nhân Viên Chính Thức và Nhân Viên Thời Vụ):
Nhân viên, dù là chính thức hay thời vụ, đều có mã và tên riêng Tuy nhiên, sự khác biệt giữa nhân viên chính thức và nhân viên thời vụ chủ yếu nằm ở cách tính lương Lớp Tổng quát Hoá đại diện cho tất cả nhân viên, vì nó bao gồm các đặc điểm chung của cả hai loại nhân viên này Trong khi đó, các lớp chuyên biệt bao gồm Nhân viên Chính thức và Nhân viên Thời vụ.
Cài đặt Kế thừa trong Kotlin như thế nào?
Ta sẽ viết ví dụ bài Nhân Viên theo hình ở trên Trong Kotlin, để viết Lớp cho phép kế thừa ta làm như sau:
Lớp Tổng quát hóa (lớp cha) Nhân Viên: open abstract class NhanVien { protected var ma:Int=0 protected var ten:String="" public abstract fun tinhLuong(ngayCong:Int):Double
Lớp cha NhanVien là một lớp trừu tượng với phương thức trừu tượng tinhLuong, điều này có nghĩa là mọi nhân viên đều có thể tính lương, nhưng không xác định được nhân viên cụ thể nào tại thời điểm này Do đó, việc khai báo tinhLuong là trừu tượng là hợp lý, vì mặc dù không biết đối tượng cụ thể, nhưng chắc chắn rằng phương thức này phải tồn tại Các hàm trừu tượng trong abstract hay interface giống như các quy tắc mà các lớp con phải tuân theo và override lại Ngoài ra, để cho phép các lớp khác kế thừa từ lớp này, cần thêm từ khóa open trước khai báo lớp.
Chúng ta sẽ tạo lớp NhanVienChinhThuc kế thừa từ lớp NhanVien bằng cách sử dụng dấu hai chấm (:) Nhìn vào hình trên, bạn có thể dễ dàng nhận thấy cách viết để NhanVienChinhThuc kế thừa từ NhanVien.
Singletons, enums, and sealed
Singleton object GoldColor : FishColor { override val color = "gold"
GoldColor được khai báo dưới dạng một đối tượng để đảm bảo tính duy nhất (singleton), vì mọi thể hiện của nó đều thực hiện các chức năng tương tự Do đó, chỉ có một trường hợp của GoldColor có thể tồn tại.
Kotlin hỗ trợ enum, cho phép liệt kê các giá trị và gọi chúng bằng tên Để khai báo một enum, bạn sử dụng từ khóa "enum" Một enum cơ bản chỉ cần một danh sách tên, nhưng bạn cũng có thể thêm các trường liên kết với mỗi tên, ví dụ: enum class Color(val rgb: Int).
RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);
Enums tương tự như các tập hợp nhỏ, cho phép chỉ một giá trị duy nhất trong mỗi kiểu liệt kê Ví dụ, chỉ có một giá trị Color.RED, Color.GREEN và Color.BLUE Trong trường hợp này, các giá trị RGB được gán cho thuộc tính rgb để đại diện cho các thành phần màu sắc Bạn cũng có thể truy cập giá trị thứ tự của một enum thông qua thuộc tính ordinal và tên của nó thông qua thuộc tính name.
Hãy thử một ví dụ khác về enum enum class Direction(val degrees: Int) {
} fun main() { println(Direction.EAST.name) println(Direction.EAST.ordinal) println(Direction.EAST.degrees)
Lớp niêm phong là một loại lớp có khả năng phân lớp, nhưng chỉ trong tệp mà nó được khai báo Nếu bạn cố gắng phân lớp lớp niêm phong này trong một tệp khác, hệ thống sẽ báo lỗi.
Kotlin cho phép trình biên dịch nhận biết tất cả các lớp con một cách tĩnh khi chúng nằm trong cùng một tệp, giúp kiểm tra lỗi hiệu quả hơn Ví dụ trong tệp AquariumFish.kt, lớp kín được định nghĩa như sau: sealed class Seal với các lớp con là SeaLion và Walrus Hàm matchSeal(seal: Seal) sử dụng cú pháp when để xác định loại lớp con, trả về "walrus" cho Walrus và "sea lion" cho SeaLion.
Các lớp Seall không thể được subclassed trong tệp khác, do đó, nếu bạn muốn thêm nhiều loại Seall, bạn phải thực hiện trong cùng một tệp Điều này khiến các lớp được niêm phong trở thành một giải pháp an toàn để đại diện cho các kiểu cố định Ví dụ, các lớp này rất hữu ích trong việc trả về kết quả thành công hoặc lỗi từ API mạng.
Viết chương trình tạo lớp sinh viên có các thông tin cơ bản như họ tên, giới tính, ngày sinh, địa chỉ
Sử dụng lớp sinh viên phía trên, Viết chương trình tạo một mảng có 5 sinh viên
Nhập thông tin cho 5 sinh viên đó, rồi in ra màn hình thông tin của cả 5 sinh viên
Những trọng tâm cần chú ý trong bài:
Trình bày được cách khai báo 1 lớp trong Kotlin
Trình bày được khái niệm lớp con và kế thừa
Viết được ứng dụng có sử dụng lớp
Yêu cầu vềđánh giá kết quả học tập:
+ Về kiến thức: Trình bày được cách khai báo 1 lớp trong Kotlin
+ Về kỹnăng: Viết được ứng dụng có sử dụng lớp
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp
+ Về kỹnăng:Viết được ứng dụng có sử dụng lớp
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc