Java
The JDK is evolving with every new release, adding more and improving existing features. Beneath the surface are hidden gems that make our lives much easier.
Not many components live on their own, without any dependencies on others. Instead of tightly coupling them, we can improve the separation of concerns with dependency injection (DI).
Many languages contain a REPL, a Read-Evaluate-Print Loop. It evaluates declarations, statements, and expressions as they are entered and immediately shows the results. With Java 9, we finally got one too.
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.
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.