[Scala] - day 6 : Collections trong Scala [phần 2] - Mutable Collections

Ở phần trước chúng ta đã tìm hiểu về List, Map và Set.Như các bạn thấy tất cả chúng đều là immutable nghĩa là khi khởi tạo xong nó không thể thay đổi được và để thay đổi collection bạn phải gán nó lại vào 1 collection mới.
Ví dụ năm ngoái tôi có 1 Map lưu tên và đặc điểm của những người yêu trước đây :
scala> val nguoiYeuCu = Map("em Dung" -> "ngoan", "em Thao" -> "xinh")
nguoiYeuCu: scala.collection.immutable.Map[String,String] = Map(em Dung -> ngoan, em Thao -> xinh)
Năm nay tôi có người yêu mới và cần update lại danh sách này :
scala> val nguoiYeuCu2016 = nguoiYeuCu + ("em Thuỷ" -> "rất hư")
nguoiYeuCu2016: scala.collection.immutable.Map[String,String] = Map(em Dung -> ngoan, em Thao -> xinh, em Thuỷ -> rất hư)
Điều này làm cho việc sử dụng dữ liệu trở lên an toàn hơn tuy nhiên cũng có rất nhiều trường hợp bạn cần đến mutable collections.

Mutable Collections

Tạo trực tiếp từ thư viện của Scala : 
Để tạo mutable collection bạn cần thư viện : collection.mutable
Tương ứng với List,Map và Set ta có 3 thư viện sau :
collection.mutable.Buffer
collection.mutable.Map
collection.mutable.Set
Tôi tạo lại Map những người yêu trước đây bằng cách sử dụng mutable collection :
scala> val nguoiYeuCu = collection.mutable.Map("em Dung" -> "ngoan", "em Thao" -> "xinh")
nguoiYeuCu: scala.collection.mutable.Map[String,String] = Map(em Dung -> ngoan, em Thao -> xinh)
scala> nguoiYeuCu += ("em Thuỷ" -> "rất hư")
res0: nguoiYeuCu.type = Map(em Dung -> ngoan, em Thao -> xinh, em Thuỷ -> rất hư)
Tạo từ immutable collections khác :
scala> val m = Map("key 1" -> "value 1", "key 2" -> "value 2")
m: scala.collection.immutable.Map[String,String] = Map(key 1 -> value 1, key 2 -> value 2)
scala> m.toBuffer
res2: scala.collection.mutable.Buffer[(String, String)] = ArrayBuffer((key 1,value 1), (key 2,value 2))
scala> val l = List("value 1", "value 2")
l: List[String] = List(value 1, value 2)
scala> l.toBuffer
res3: scala.collection.mutable.Buffer[String] = ArrayBuffer(value 1, value 2)
scala> val s = Set(1,2,3,4,5,5,5,5,6)
s: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
scala> s.toBuffer
res4: scala.collection.mutable.Buffer[Int] = ArrayBuffer(5, 1, 6, 2, 3, 4)
*) bạn cũng có thể convert 1 immutable thành 1 mutable bằng cách sử dụng: toList, toMap and toSet .Giờ bạn hãy thử tạo vào mutable and convert thành immutable.
Trong thế giới mutable Buffer rất hữu dụng để tạo ra mutable collection tuy nhiên chỉ có nó được dùng rộng rãi quá. Có 1 cách khác để bạn có thể sử dụng mutable collection an toàn hơn là sử dụng builder

Collection Builders

Builder là form giản đơn của buffer , để tạo ra một builder với kiểu collection cụ thể bạn cần KieuCollection.newBuilder[kiểu dữ liệu của collection] 
Tôi sẽ tạo ra 1 builder là 1 Set của nhiều kí tự :

scala> val sbc = Set.newBuilder[Char]
sbc: scala.collection.mutable.Builder[Char,scala.collection.immutable.Set[Char]] = scala.collection.mutable.SetBuilder@3ede428e
scala> sbc += 'c'
res5: sbc.type = scala.collection.mutable.SetBuilder@3ede428e
scala> sbc ++= Set('h','a','o')
res6: sbc.type = scala.collection.mutable.SetBuilder@3ede428e
scala> sbc.result
res7: scala.collection.immutable.Set[Char] = Set(c, h, a, o)
Builder sẽ là 1 lựa chọn tốt khi bạn muốn tạo một mutable collection chỉ để sau đó tạo ra 1 immutable collection.
Ok,có lẽ hôm nay nên dừng lại ở đây và hôm sau ta sẽ cùng tìm hiểu về Array, Seq.

Comments