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:
Java 13:
Java 12:
Java 11:
Java 9:
- 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
You can read more from me on codefx.org, watch me blab on my YouTube channel, or follow me on Twitter.
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.
Create/modify 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 compile.sh
, 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 executables.sh
.
For some features, you have to run the .sh
scripts in the root directory.
If that's necessary, the feature list below mentions it.
The module system is too big to demo here. Check out the jpms tag on my blog, this demo project, or my book on the module system.
- ⓧ sealed classes (JEP 360)
- ⑯
instanceof
pattern matching (articles 1, 2, JEP 394) - ⑮ text blocks (article, JEP 378)
- ⑭ switch expressions (article, video, JEP 361)
- ⑩ 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)
- ⑨
@SaveVarargs
on private non-final methods (JEP 213) - ⑨ no warnings for deprecated imports (JEP 211)
- ⑯ Unix domain sockets (article, JEP-380)
- ⑪ 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)
- ⑯ Unix domain socket support in
SocketChannel
/ServerSocketChannel
API (JEP 380, article) - ⑫⑪
String
in Java 12 and in Java 11 - ⑯⑫⑨
Stream
in Java 16 (article 1, 2), in Java 12 (article), and in Java 9 (article) - ⑫ formating numbers
- ⑫
Files::mismatch
- ⑫ error recovery with
CompletableFuture
- ⑪ I/O
- ⑪
Predicate
/Pattern
- ⑪
Collection
- ⑪⑨
Optional
in 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:
- ⑬⑫⑩ 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)