Immutability
A cornerstone of functional programming is the concept of immutability. This dictates that an object remains unaltered from the time a function receives it as input until the function generates an output. You might wonder, how could the object change in the first place? To clarify, let’s examine a straightforward example:
fun <T> printAndClear(list: MutableList<T>) {
for (e in list) {
println(e)
list.remove(e)
}
}
printAndClear(mutableListOf("a", "b", "c"))
The code would initially output a
, but then a ConcurrentModificationException
would occur.
This happens because the for-each
loop utilizes an iterator (a topic we discussed in the previous chapter). Modifying the list within the loop disrupts its operation. This leads us to ponder:
Wouldn’t it be wonderful to safeguard against such runtime exceptions from the get-go?
Next, we’ll discuss how immutable collections...