2016-02-27 12 views
20

Tôi muốn có một bản sao mới của một số Bản đồ có cùng nội dung nhưng Bản đồ không có phương thức được xây dựng trong copy. Tôi có thể làm một cái gì đó như thế này:Cách thông minh nhất để sao chép Bản đồ trong Kotlin là gì?

val newInst = someMap.map { it.toPair() }.toMap() 

Nhưng có vẻ khá xấu xí. Có cách nào thông minh hơn để làm điều này không?

+0

không hiệu quả lắm, rất nhiều đối tượng tạm thời được phân bổ – voddan

+0

@voddan Tôi biết, đó là w hy tôi đã hỏi câu hỏi này. –

+0

tôi nghĩ đó là lỗi: https://youtrack.jetbrains.com/issue/KT-11221 – voddan

Trả lời

31

Chỉ cần sử dụng HashMap constructor:

val original = hashMapOf(1 to "x") 
val copy = HashMap(original) 

Cập nhật cho Kotlin 1.1:

Since Kotlin 1.1, các chức năng mở rộng Map.toMapMap.toMutableMap tạo bản sao.

+0

Cảm ơn bạn! Nó không hoạt động cho các bản đồ bất biến, nhưng vẫn tuyệt vời cho những bản đồ có thể thay đổi được. –

+2

Nếu bạn muốn kết quả là loại chỉ đọc, hãy khai báo kiểu thủ công hoặc sử dụng dàn diễn viên: 'val copy: Bản đồ = HashMap (bản gốc)' hoặc 'val copy = HashMap (bản gốc) làm Bản đồ '. Nếu bạn làm điều này nhiều lần, hãy viết một hàm mở rộng. –

+2

@ N.Kudriavtsev bản đồ không phải là bất biến, chúng chỉ được truy cập từ một giao diện chỉ đọc. Vì vậy, ví dụ trên không hoạt động nếu bạn giữ nó bằng một biến chỉ đọc ở cuối. –

5

Sử dụng putAll phương pháp:

val map = mapOf("1" to 1, "2" to 2) 
val copy = hashMapOf<String, Int>() 
copy.putAll(map) 

Hoặc:

val map = mapOf("1" to 1, "2" to 2) 
val copy = map + mapOf<String, Int>() // preset 

cách của bạn cũng có vẻ thành ngữ đối với tôi.

+1

Cảm ơn bạn đã trả lời! Rõ ràng, bạn muốn nói 'val copy = hashMapOf (); copy.putAll (map) 'bởi vì putAll trả về Unit. Tất nhiên nó có vẻ tốt hơn mã của tôi, tuy nhiên, nó là một phương pháp Java, có nhiều hơn một dòng và không làm việc với các bản đồ bất biến .. Có thực sự là cách tốt nhất? –

+0

Tôi đã sửa lại ví dụ. Tôi không thấy một vấn đề với việc gọi một phương thức Java, nhưng bất biến là quan trọng đối với trường hợp của bạn, sau đó phương thức của bạn trông tốt hơn. – marcospereira

+0

Gọi một phương thức Java không phải là một vấn đề chính nó, vấn đề là khi các hoạt động nguyên thủy đòi hỏi nhiều hơn một dòng mã trong một ngôn ngữ được định vị như là một thay thế đơn giản cho Scala. Biến thể thứ hai của bạn tốt hơn nhiều. Và tôi nghĩ rằng bây giờ nó là biến thể tốt nhất cho bất biến, vì vậy cảm ơn bạn một lần nữa! Tính bất biến không quan trọng đối với tôi ngay bây giờ, tôi chỉ quan tâm. –

1

Cách đề xuất để làm điều này là:

map.toList().toMap() 

Tuy nhiên, phương pháp của java là nhanh hơn 2 đến 3 lần:

(map as LinkedHashMap).clone() 

Dù sao, nếu nó làm phiền bạn rằng không có cách nào thống nhất của nhân bản bộ sưu tập của Kotlin (và có trong Java!), bỏ phiếu ở đây: https://youtrack.jetbrains.com/issue/KT-11221

Các vấn đề liên quan