Convert iterable of pairs to map, improve generic toMap(mutableMap) function #KT-4166 Fixed
This commit is contained in:
committed by
Andrey Breslav
parent
3a1b9cc658
commit
ab45439256
@@ -1,3 +1,5 @@
|
||||
package kotlin
|
||||
|
||||
public class EmptyIterableException(val it : Iterable<*>) : RuntimeException("$it is empty")
|
||||
|
||||
public class DuplicateKeyException(val message : String = "Duplicate keys detected") : RuntimeException(message)
|
||||
@@ -18,7 +18,7 @@ public fun <K, V> MutableMap<K, V>.set(key : K, value : V) : V? = this.put(key,
|
||||
|
||||
/** Returns the [[Map]] if its not null otherwise it returns the empty [[Map]] */
|
||||
public fun <K,V> Map<K,V>?.orEmpty() : Map<K,V>
|
||||
= if (this != null) this else Collections.emptyMap<K,V>() as Map<K,V>
|
||||
= if (this != null) this else stdlib_emptyMap()
|
||||
|
||||
public fun <K,V> Map<K,V>.contains(key : K) : Boolean = containsKey(key)
|
||||
|
||||
@@ -94,19 +94,39 @@ public inline fun <K,V,R,C: MutableMap<K,R>> Map<K,V>.mapValuesTo(result: C, tra
|
||||
* Puts all the entries into this [[MutableMap]] with the first value in the pair being the key and the second the value
|
||||
*/
|
||||
public fun <K,V> MutableMap<K,V>.putAll(vararg values: Pair<K, V>): Unit {
|
||||
for (v in values) {
|
||||
put(v.first, v.second)
|
||||
for ((key, value) in values) {
|
||||
put(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies the entries in this [[Map]] to the given mutable *map*
|
||||
*/
|
||||
public fun <K,V> Map<K,V>.toMap(map: MutableMap<K,V>): Map<K,V> {
|
||||
public fun <K,V, C : MutableMap<K, in V>> Map<K,V>.toMap(map: C): C {
|
||||
map.putAll(this)
|
||||
return map
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies the entries from given iterable of pairs to the given mutable *map*
|
||||
*/
|
||||
public fun <K,V, C : MutableMap<K, in V>> Iterable<Pair<K,V>>.toMap(map: C): C {
|
||||
for((key,value) in this) {
|
||||
if (map.containsKey(key)) {
|
||||
throw DuplicateKeyException()
|
||||
}
|
||||
map.put(key,value)
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates map from given iterable of pairs
|
||||
*/
|
||||
public fun <K,V> Iterable<Pair<K,V>>.toMap() : Map<K,V> {
|
||||
return toMap(HashMap<K,V>())
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new Map containing the results of applying the given *transform* function to each [[Map.Entry]] in this [[Map]]
|
||||
*
|
||||
|
||||
@@ -11,14 +11,14 @@ import java.util.Properties
|
||||
/**
|
||||
* Converts this [[Map]] to a [[LinkedHashMap]] so future insertion orders are maintained
|
||||
*/
|
||||
public fun <K,V> Map<K,V>.toLinkedMap(): LinkedHashMap<K,V> = toMap<K,V>(LinkedHashMap(size)) as LinkedHashMap<K,V>
|
||||
public fun <K,V> Map<K,V>.toLinkedMap(): LinkedHashMap<K,V> = toMap(LinkedHashMap<K,V>(size))
|
||||
|
||||
/**
|
||||
* Converts this [[Map]] to a [[SortedMap]] so iteration order will be in key order
|
||||
*
|
||||
* @includeFunctionBody ../../test/collections/MapTest.kt toSortedMap
|
||||
*/
|
||||
public fun <K,V> Map<K,V>.toSortedMap(): SortedMap<K,V> = toMap<K,V>(TreeMap()) as SortedMap<K,V>
|
||||
public fun <K,V> Map<K,V>.toSortedMap(): SortedMap<K,V> = toMap(TreeMap<K,V>())
|
||||
|
||||
/**
|
||||
* Converts this [[Map]] to a [[SortedMap]] using the given *comparator* so that iteration order will be in the order
|
||||
@@ -26,7 +26,7 @@ public fun <K,V> Map<K,V>.toSortedMap(): SortedMap<K,V> = toMap<K,V>(TreeMap())
|
||||
*
|
||||
* @includeFunctionBody ../../test/collections/MapTest.kt toSortedMapWithComparator
|
||||
*/
|
||||
public fun <K,V> Map<K,V>.toSortedMap(comparator: Comparator<K>): SortedMap<K,V> = toMap<K,V>(TreeMap(comparator)) as SortedMap<K,V>
|
||||
public fun <K,V> Map<K,V>.toSortedMap(comparator: Comparator<K>): SortedMap<K,V> = toMap(TreeMap<K,V>(comparator))
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -140,6 +140,13 @@ class MapTest {
|
||||
assertEquals(2, map.get("b"))
|
||||
}
|
||||
|
||||
test fun createFromIterable() {
|
||||
val map = listOf(Pair("a", 1), Pair("b", 2)).toMap()
|
||||
assertEquals(2, map.size)
|
||||
assertEquals(1, map.get("a"))
|
||||
assertEquals(2, map.get("b"))
|
||||
}
|
||||
|
||||
test fun createUsingTo() {
|
||||
val map = hashMapOf("a" to 1, "b" to 2)
|
||||
assertEquals(2, map.size)
|
||||
|
||||
Reference in New Issue
Block a user