Functional versus imperative programming
At its heart, Java is an imperative language. In an imperative language, it is normal to have mutable variables and classes that keep internal states. In Java, a normal Plain Old Java Object (POJO) is an excellent example of the imperative programming paradigm. A standard POJO has variables that can be freely changed by calling the setter methods. Any code that can reach a POJO instance can modify its variables. This can lead to both subtle and hard-to-find bugs, especially when multiple threads try to alter a variable at the same time.
In functional programming, code is written in such a way that existing variables are not modified while the program is running. Values are specified as function parameters and output is generated based on their parameters. Functions are required to return the same output when specifying the same parameters on each call.
Let's look at a very simple, naive example. Do not worry too much about the syntax; the Scala language...