我需要像这样在Map中存储值:
val map = HashMap<String, Set<String>>()
但是很难与Map内的集合交互。Kotlin中是否有Multimap in Google Guava这样的多Map实现?
6ljaweal1#
不,目前没有,将来也可能没有。参考:https://discuss.kotlinlang.org/t/the-standard-library-and-a-kotlin-manifesto/1303/6备选方案:
org.springframework.util.MultiValueMap org.apache.commons.collections4.MultiMap com.google.common.collect.Multimap
要使用示例中的Set,您可以:
Set
map["key"].forEach(::println)
或者别的什么。
mm9b1k5b2#
但是很难与Map内的集合交互。这并不难,例如:
val map = HashMap<String, MutableSet<String>>() map.getOrPut("howdy") { mutableSetOf() }.add("world")
wkyowqbh3#
您还可以用途:val myMap = LinkedMultiValueMap<String, String>().apply {add("Hello", "World")}
val myMap = LinkedMultiValueMap<String, String>().apply {add("Hello", "World")}
flvtvl504#
如果您在JVM和Spring上使用Kotlin:您可以将collectionUtils用于MultivalueMap:你也可以得到一个不可修改的类型这实际上只是在修改时抛出UnsupportedOperationException。
collectionUtils
MultivalueMap
UnsupportedOperationException
val myMap = mapOf("1" to listOf(1,2,3)) CollectionUtils.unmodifiableMultiValueMap(CollectionUtils.toMultiValueMap(myMap))
omjgkv6w5#
对于基本的使用,像这样的东西可以很方便:
class MutableMultimap<K, V> { private val map: MutableMap<K, MutableSet<V>> = HashMap() operator fun get(key: K): Set<V> = map[key] ?: emptySet() operator fun contains(key: K): Boolean = map.containsKey(key) fun contains(key: K, value: V): Boolean = map[key]?.contains(value) ?: false fun add(key: K, value: V) : Boolean { return map.getOrPut(key) { mutableSetOf() }.add(value) } fun remove(key: K, value: V): Boolean { val values = map[key] ?: return false val removed = values.remove(value) if (values.isEmpty()) map.remove(key) return removed } }
当然,对此的各种优化当然是可能的。
5条答案
按热度按时间6ljaweal1#
不,目前没有,将来也可能没有。
参考:https://discuss.kotlinlang.org/t/the-standard-library-and-a-kotlin-manifesto/1303/6
备选方案:
要使用示例中的
Set
,您可以:或者别的什么。
mm9b1k5b2#
但是很难与Map内的集合交互。
这并不难,例如:
wkyowqbh3#
您还可以用途:
val myMap = LinkedMultiValueMap<String, String>().apply {add("Hello", "World")}
flvtvl504#
如果您在JVM和Spring上使用Kotlin:您可以将
collectionUtils
用于MultivalueMap
:你也可以得到一个不可修改的类型这实际上只是在修改时抛出UnsupportedOperationException
。omjgkv6w5#
对于基本的使用,像这样的东西可以很方便:
当然,对此的各种优化当然是可能的。