As you may know, Kotlin has a lot of useful functions to work with collections and maps. One such function is Iterable.partition()
which splits a given iterable into a pair of lists by predicate. For instance:
val list = listOf(100, -5, 42, 25)
val (lessThan42, greaterThanOrEqualTo42) = list.partition { it < 42 }
println("lessThan42=$lessThan42")
println("greaterThanOrEqualTo42=$greaterThanOrEqualTo42")
And the output is
lessThan42=[-5, 25]
greaterThanOrEqualTo42=[100, 42]
However, for some reason, there is no partition()
function for maps. So, let's right the wrong and create an extension function for it:
fun <K, V> Map<K, V>.partition(predicate: (Map.Entry<K, V>) -> Boolean): Pair<Map<K, V>, Map<K, V>> {
val map1 = mutableMapOf<K, V>()
val map2 = mutableMapOf<K, V>()
entries.forEach {
if (predicate(it)) {
map1[it.key] = it.value
} else {
map2[it.key] = it.value
}
}
return Pair(map1, map2)
}
Here is the usage example:
val list = listOf(100, -5, 42, 25)
val map = list.associateWith { it.toString() }
val (keyLessThan42, keyGreaterThanOrEqualTo42) = map.partition { it.key < 42 }
println("keyLessThan42=$keyLessThan42")
println("keyGreaterThanOrEqualTo42=$keyGreaterThanOrEqualTo42")
And the output is
keyLessThan42={-5=-5, 25=25}
keyGreaterThanOrEqualTo42={100=100, 42=42}
Dream your code, code your dream.
Top comments (0)