2016-04-25 19 views
8

Tôi muốn sử dụng MutableMapwith defaults:Cách sử dụng với trình bao bọc mặc định?

val myMap = mutableMapOf<String, Set<String>>().withDefault { mutableSetOf() } 

nhưng tôi không thể sử dụng phương pháp getOrImplicitDefaultwithDefault lợi nhuận MutableMap<String, Set<String>> loại. Hơn nữa, tôi không thể truyền tới giao diện MutableMapWithDefaultthis is a private interface.

Tôi không thể sử dụng phương pháp get vì phương thức này trả về loại có thể không có giá trị. Nó là ok vì đây là một phương pháp trên giao diện MutableMap (hơn nữa nó không gọi defaultValue gọi lại để nhận giá trị mặc định).

Dường như chức năng này không được triển khai chính xác trong Kotlin hoặc tôi đang sử dụng sai. Vì vậy, làm cách nào để sử dụng trình bao bọc withDefault chính xác?

+0

['SetMultimap'] của ổi (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/SetMultimap.html) hoặc [' LoadingCache'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/LoadingCache.html) trông giống như phù hợp hơn với những gì bạn đang cố gắng hoàn thành. – mfulton26

Trả lời

5

Hiện tại, trình bao bọc được trả lại bởi withDefault chỉ có thể sử dụng được trong các trường hợp sử dụng ủy quyền thuộc tính.

val map = mutableMapOf<String, Set<String>>().withDefault { mutableSetOf() } 

var property: Set<String> by map // returns empty set by default 
1

Vâng, tất cả các triển khai của getOrImplicitDefault chuyển hướng đến getOrElseNullable. Có thể thử điều đó.

+0

Giải pháp này có vấn đề: cần chỉ định lambda với giá trị mặc định cho mọi lệnh gọi phương thức 'getOrElseNullable'. Tôi cố gắng tránh điều này và chỉ muốn khai báo giá trị mặc định ở một nơi duy nhất. –

4

Hình như trong Kotlin 1.1 này thực sự hoạt động nếu bạn sử dụng getValue() chức năng thay vì get() chức năng.

+1

Hình như giá trị mặc định được trả về, nhưng không được đưa vào bản đồ ... thay vì vô ích. – Guillaume

+0

Trong số tò mò, tại sao bạn cần nó được đưa vào bản đồ nếu chỉ cần gọi getValue() một lần nữa giúp bạn có được giá trị một lần nữa? – sschuberth

+0

Tôi muốn cung cấp một cách mặc định để tạo một đối tượng với khóa được cung cấp nếu bản đồ không chứa bất kỳ giá trị nào với khóa này. Đây là cách withDefault hoạt động trong Groovy và tôi muốn làm điều tương tự trong Kotlin. Bởi vì tôi cần phải lấy lại cùng một thể hiện sau init và tôi cần phải thay đổi nó. Đây là cách Groovy để làm điều này: http://mrhaki.blogspot.ch/2010/07/groovy-goodness-map-with-default-values.html – Guillaume

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