Immutability
One of the fundamental concepts of functional programming is immutability. This means that from the moment the function receives input to the moment the function returns output, the object doesn't change. But how could it change? Well, let's look at a simple example:
fun <T> printAndClear(list: MutableList<T>) { for (e in list) { println(e) list.remove(e) } } printAndClear(mutableListOf("a", "b", "c"))
This code would output a
first, and then we would receive ConcurrentModificationException
.
The reason for this is that the for-each
loop uses an iterator (which we already discussed in the previous chapter), and by mutating the list inside the loop, we interfere with its operation. However, this raises a question:
Wouldn't it be great if we could protect ourselves...