1. Xây dựng từ các phần tử

Cách phổ biến nhất để tạo ra một collection là tạo collection với các hàm của thư viện chuẩn như listOf<T>(), setOf<T>(), mutableListOf<T>(), mutableSetOf<T>(). Nếu bạn cung cấp danh sách các phần tử của collection được phân tách bằng dấu phẩy làm đối số, trình biên dịch sẽ tự động phát hiện kiểu dữ liệu của phần tử. Khi tạo collection trống, hãy chỉ định kiểu rõ ràng.

val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()

Điều tương tự cũng được áp dụng cho các map có hàm mapOf()mutableMapOf(). Các key và value của map được chuyển dưới dạng đối tượng Pair (thường được tạo bằng hàm infix to).

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

Lưu ý rằng ký hiệu to tạo ra một đối tượng Pair tồn tại ngắn hạn, vì vậy bạn chỉ nên sử dụng nó trong trương hợp hiệu suất không quan trọng. Để tránh sử dụng quá nhiều bộ nhớ, hãy sử dụng các cách khác. Ví dụ: bạn có thể tạo một map có thể thay đổi và điền nó bằng các thao tác ghi. Hàm apply() có thể giữ cho việc khởi tạo trở nên trôi chảy trong trường hợp này..

val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }

2. Collection trống

Ngoài ra còn có các hàm để tạo collection mà không chứa bất kì phần tử nào như: emptyList(), emptySet(), và emptyMap(). Khi tạo các collection trống, bạn nên chỉ định kiểu dữ liệu của phần tử mà collection sẽ lưu trữ.

val empty = emptyList<String>()

3. Chức năng khởi tạo cho các list

Đối với list, có một hàm tạo lấy để kích thước danh sách và một hàm khởi tạo để xác định giá trị phần tử dựa trên chỉ mục của nó.

val doubled = List(3, { it * 2 })  // or MutableList if you want to change its content later
println(doubled)

4. Các hàm tạo kiểu cụ thể 

Để tạo một collection kiểu cụ thể, chẳng hạn như ArrayList hoặc LinkedList, bạn có thể sử dụng các hàm tạo có sẵn cho các kiểu này. Các hàm tạo tương tự cũng có sẵn để triển khai Set và Map.

val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)

5. Sao chép

Để tạo một collection có các phần tử giống như một collection hiện có, bạn có thể sử dụng các thao tác sao chép. Thao tác sao chép collection từ thư viện chuẩn tạo ra các collection bản shallow copy với các tham chiếu đến các phần tử giống nhau. Do đó, một thay đổi được thực hiện đối với một phần tử collection phản ánh trong tất cả các bản sao của nó.

Các hàm sao chép collection chẳng hạn như toList(), toMutableList(), toSet()và những hàm khác tạo ra một bản chụp của một collection tại một thời điểm cụ thể. Kết quả của những hàm này là một collection mới có các phần tử giống collection đã cho. Nếu bạn thêm hoặc xóa các phần tử khỏi collection gốc, điều này sẽ không ảnh hưởng đến các bản sao. Các bản sao cũng có thể được thay đổi một cách độc lập với bản gốc.

val sourceList = mutableListOf(1, 2, 3)
val copyList = sourceList.toMutableList()
val readOnlyCopyList = sourceList.toList()
sourceList.add(4)
println("Copy size: ${copyList.size}")   

//readOnlyCopyList.add(4)             // compilation error
println("Read-only copy size: ${readOnlyCopyList.size}")

Các hàm này cũng có thể được sử dụng để chuyển đổi collection sang các loại khác, ví dụ: xây dựng một set từ một list hoặc ngược lại.

val sourceList = mutableListOf(1, 2, 3)    
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)    
println(copySet)

Ngoài ra, bạn có thể tạo các tham chiếu mới cho cùng một phiên bản collection. Các tham chiếu mới được tạo khi bạn khởi tạo biến collection với một collection hiện có. Vì vậy, khi instance của collection được thay đổi thông qua một tham chiếu, những thay đổi được phản ánh trong tất cả các tham chiếu của nó.

val sourceList = mutableListOf(1, 2, 3)
val referenceList = sourceList
referenceList.add(4)
println("Source size: ${sourceList.size}")

Khởi tạo collection có thể được sử dụng để hạn chế khả năng thay đổi. Ví dụ: nếu bạn tạo một List tham chiếu đến a MutableList, trình biên dịch sẽ báo lỗi nếu bạn cố gắng sửa đổi collection thông qua tham chiếu này.

val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4)            //compilation error
sourceList.add(4)
println(referenceList) // shows the current state of sourceList

6. Gọi hàm trên các collection khác

Collection có thể được tạo ra nhờ nhiều thao tác trên các collection khác. Ví dụ: việc lọc một list có sẵn sẽ tạo một list mới các phần tử đáp ứng yêu cầu của bộ lọc:

val numbers = listOf("one", "two", "three", "four")  
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)

Ánh xạ tạo ra một danh sách các kết quả thay đổi:

val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
println(numbers.mapIndexed { idx, value -> value * idx })

Association tạo ra map:

val numbers = listOf("one", "two", "three", "four")
println(numbers.associateWith { it.length })

Để biết thêm thông tin về các thao tác trên collection trong Kotlin, hãy xem Tổng quan về thao tác trên collection .

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!