Java X Feature Demo
Demonstrates most features that were introduced by Java 9 and later versions. The links below take you to the demos in this project, the JEPs responsible for introducing the feature, and to other sources if available.
For a more practical approach to many of these features, including some quick code metrics, check my Java After Eight repo.
These articles discuss the recent Java versions and list a lot of the new features:
- Code-First Java 9 Tutorial
- The Ultimate Guide to Java 9
- Inside Java 9 – Version Schema, Multi-Release JARs, and More
- Inside Java 9 – Performance, Compiler, and More
This project requires at least the most recent Java release, at times even early-access builds of upcoming versions. You can get OpenJDK builds for both from jdk.java.net, although I prefer using SDKMAN.
Most of the project can be built with Maven.
It uses toolchains to configure which Java version Maven should use for compilation and packaging.
toolchains.xml in Maven's user folder (
~/.m2/ on Linux) to contain a block like the following:
<!-- if the file already contains a <toolchains> tag, you only need the inner <toolchain> block --> <toolchains> <toolchain> <type>jdk</type> <provides> <version>13</version> <vendor>OpenJDK</vendor> </provides> <configuration> <jdkHome>/opt/jdk/13</jdkHome> </configuration> </toolchain> </toolchains>
If your IDE doesn't like new syntax or APIs, you can always compile and run by hand - see
run.sh (which expects the fully qualified name of the main class as argument) and
compile-run.sh (conveniently combines the two - also needs the main class).
The scripts are written for Linux but should look similar on other operating systems.
If the appropriate Java version is not on your path, configure it in
For some features, you have to run the
.sh scripts in the root directory.
If that's necessary, the feature list below mentions it.
Java Platform Module System
- ⑬ text blocks (article)
- ⑬⑫ switch expressions (article, video, JEP 325, JEP 354)
- ⑩ local-variable type inference with
var(article, video, JEP 286)
- ⑨ private interface methods (JEP 213)
- ⑨ try-with-resources on effectively final variables (JEP 213)
- ⑨ diamond operator for anonymous classes (JEP 213)
@SaveVarargson private non-final methods (JEP 213)
- ⑨ no warnings for deprecated imports (JEP 211)
- ⑪ HTTP/2 client: simple, more formal (tutorial, reactive request/response bodies)
- ⑩⑨ version API, introduced in Java 9, updated in Java 10
- ⑨ collection factory methods (instead of collection literals; JEP 269)
- ⑨ reactive streams (JEP 266)
- ⑨ stack walking (JEP 259, post on SitePoint including benchmarks)
- ⑨ multi-resolution images (JEP 251)
- ⑨ platform-specific desktop features (not supported by my OS so my sample sucks; PRs welcome! JEP 272)
- ⑨ deserialization filter (targeted for JDK 9 but wasn't implemented when I created this; JEP 290)
Stringin Java 12 and in Java 11
Streamin Java 12 (article) and in Java 9 (article)
- ⑫ formating numbers
- ⑫ error recovery with
- ⑪ I/O
Optionalin Java 11 and in Java 9 (article)
- ⑨ OS processes (JEP 102)
Some of the small changes have their own articles (in which case they are linked), but many don't. Most are show-cased in these posts, though:
JVM & Tooling
- ⑬⑫⑩ application class-dara sharing (article, JEP 310, JEP 341, JEP 350)
- ⑪ single-source-file execution and scripting: run the script with
cat echo-haiku.txt | ./echo(article, JEP 330)
- ⑨ multi-release JARs: classes and the script (JEP 238)
- ⑨ platform logging: classes and the script (JEP 264)