Constructing Collections
The same is available for maps with the functions mapOf()
and . The map’s keys and values are passed as Pair
objects (usually created with to
infix function).
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
Note that the to
notation creates a short-living Pair
object, so it’s recommended that you use it only if performance isn’t critical. To avoid excessive memory usage, use alternative ways. For example, you can create a mutable map and populate it using the write operations. The apply()
function can help to keep the initialization fluent here.
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }
Empty collections
There are also functions for creating collections without any elements: emptyList()
, , and emptyMap()
. When creating empty collections, you should specify the type of elements that the collection will hold.
val empty = emptyList<String>()
For lists, there is a constructor that takes the list size and the initializer function that defines the element value based on its index.
Concrete type constructors
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)
To create a collection with the same elements as an existing collection, you can use copying operations. Collection copying operations from the standard library create shallow copy collections with references to the same elements. Thus, a change made to a collection element reflects in all its copies.
Collection copying functions, such as toList()
, , toSet()
and others, create a snapshot of a collection at a specific moment. Their result is a new collection of the same elements. If you add or remove elements from the original collection, this won’t affect the copies. Copies may be changed independently of the source as well.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
val copyList = sourceList.toMutableList()
val readOnlyCopyList = sourceList.toList()
sourceList.add(4)
//readOnlyCopyList.add(4) // compilation error
println("Read-only copy size: ${readOnlyCopyList.size}")
//sampleEnd
}
These functions can also be used for converting collections to other types, for example, build a set from a list or vice versa.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)
//sampleEnd
}
Alternatively, you can create new references to the same collection instance. New references are created when you initialize a collection variable with an existing collection. So, when the collection instance is altered through a reference, the changes are reflected in all its references.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
//referenceList.add(4) //compilation error
sourceList.add(4)
println(referenceList) // shows the current state of sourceList
//sampleEnd
}
Invoking functions on other collections
Collections can be created in result of various operations on other collections. For example, filtering a list creates a new list of elements that match the filter:
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)
//sampleEnd
}
produces a list of a transformation results:
fun main() {
//sampleStart
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
println(numbers.mapIndexed { idx, value -> value * idx })
}
Association produces maps:
For more information about operations on collections in Kotlin, see .