Immutability is one of the core concepts of functional programming. “Fully” functional programming languages support it by design, at a language-level. But in Java, we need to design and implement it ourselves, at code-level.
By designing and writing code, we naturally start to develop our own personal style and habits, good and bad. The more code we write with the intent to improve, the better we’ll get eventually.
Java 8 gave us the Stream API, a lazy-sequential data pipeline of functional blocks.
With JSR-175, Java 5 gained a metadata facility, allowing us to annotate our code with decorative syntactic metadata.
Java’s new functional abilities come with a plethora of included types. Let’s take a look into the box of provided tools.
Java has different methods of comparing objects and primitives, each with its own semantics. Using the “wrong” one can lead to unexpected results and might introduce subtle, hard-to-catch bugs.