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/YAML-first build pipeline:
- Source of truth: Individual
content/category/slug.jsonfiles (112 patterns across 11 category folders) - Templates:
templates/— shared HTML templates with{{placeholder}}tokens for content and UI strings - Generator:
html-generators/generate.java— JBang script that produces all HTML pages, localized variants, anddata/snippets.json - Translations:
translations/strings/{locale}.yamlfor UI strings,translations/content/{locale}/for pattern content (YAML) - Deploy: GitHub Actions runs the generator and deploys to GitHub Pages
Generated files (site/category/*.html, site/{locale}/, and site/data/snippets.json) are in .gitignore — never edit them directly.
The site supports 11 languages: English, Deutsch, Español, Português (Brasil), 中文 (简体), العربية, Français, 日本語, 한국어, Italian and Polski. See specs/i18n/i18n-spec.md for the full specification.
- 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. JBang is needed to run the generator.
For development on the generator itself, you can use JBang or Python — see html-generators/README.md for details.
Contributions are welcome! See CONTRIBUTING.md for details on adding patterns and translating the site.
- 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.