Java has evolved. Your code can too.
A collection of side-by-side code comparisons showing old Java patterns next to their clean, modern replacements — from Java 8 all the way to Java 25.
Note: Update the snippet count badge above when adding new patterns.
Every snippet shows two panels:
- ✕ Old — the traditional way (Java 7/8 era)
- ✓ Modern — the clean, idiomatic replacement (Java 9–25)
Each comparison includes an explanation of why the modern approach is better, which JDK version introduced it, and links to related patterns.
| Category | Examples |
|---|---|
| Language | Records, sealed classes, pattern matching, switch expressions, var, unnamed variables |
| Collections | Immutable factories, sequenced collections, unmodifiable collectors |
| Strings | Text blocks, isBlank(), strip(), repeat(), formatted(), indent() |
| Streams | toList(), mapMulti(), takeWhile()/dropWhile(), gatherers |
| Concurrency | Virtual threads, structured concurrency, scoped values, ExecutorService as AutoCloseable |
| I/O | Files.readString(), writeString(), Path.of(), transferTo(), HTTP Client |
| Errors | requireNonNullElse(), record-based errors, deserialization filters |
| Date/Time | java.time basics, Duration/Period, DateTimeFormatter, instant precision |
| Security | TLS defaults, SecureRandom, PEM encoding, key derivation functions |
| Tooling | JShell, single-file execution, JFR profiling, compact source files, AOT |
| Enterprise | EJB → CDI, JDBC → JPA/Jakarta Data, JNDI → injection, MDB → reactive messaging, REST |
This site uses a JSON-first build pipeline:
- Source of truth: Individual
content/category/slug.jsonfiles (107 across 11 category folders) - Templates:
templates/— shared HTML templates with{{placeholder}}tokens - Generator:
html-generators/generate.jar— pre-built fat JAR that produces all HTML detail pages anddata/snippets.json - Deploy: GitHub Actions runs the generator and deploys to GitHub Pages
Generated files (site/category/*.html and site/data/snippets.json) are in .gitignore — never edit them directly.
- Java 25+ (e.g. Temurin)
# Generate all HTML pages and data/snippets.json into site/
jbang html-generators/generate.java
# Serve locally
jwebserver -b 0.0.0.0 -d site -p 8090
# Open http://localhost:8090The fat JAR is a self-contained ~2.2 MB file with all dependencies bundled. No JBang installation needed.
For development on the generator itself, you can use JBang or Python — see html-generators/README.md for details.
Contributions are welcome! Content is managed as JSON files — never edit generated HTML.
- Fork the repo
- Create a new JSON file in the appropriate
content/<category>/folder (e.g.content/language/my-feature.json) - Copy
content/template.jsonto the new file as a starting point for all required fields (see the snippet JSON schema for details) - Update the
prev/nextfields in adjacent pattern JSON files to maintain navigation - Run
jbang html-generators/generate.javato verify your changes build correctly - Open a pull request
Please ensure JDK version labels only reference the version where a feature became final (non-preview).
- Plain HTML, CSS, and JavaScript — no frontend frameworks
- JBang + Jackson for build-time generation
- Hosted on GitHub Pages via GitHub Actions
Bruno Borges
- GitHub: @brunoborges
- X/Twitter: @brunoborges
- LinkedIn: brunocborges
This project is licensed under the MIT License.