Java 22: Unwrapped 📦
What You Need to Know
1
Who Am I?
Oleh Melnyk
● Software Engineer @Jappware
● Java enthusiast
● Sometimes pretending to be a speaker
● Coffee lover and netflix watcher
2
3
🇺🇦 Donate & Support - we’re strong together
🔖 Agenda
1. Current JDK state overview
2. Finalized/Delivered features
3. Preview/Incubating features
4. Minor API updates
5. Predicting the future
6. Friendly ☺️🍻 discussion
4
️ Where we are
5
️ Where we are
https://inside.java/2024/03/19/the-arrival-of-java-22/
6
🔬 Install and explore
7
8
GraalVM ️ Java 22
https://medium.com/graalvm/welcome-graalvm-for-jdk-22-8a48849f054c
9
10
JEP 456: Unnamed Variables
& Patterns
11
What is unnamed variables?
12
What is unnamed patterns?
Improve the readability by eliding unnecessary pattern components
13
What is unnamed patterns?
14
JEP 457: Class-File API
(Preview)
15
📁 Class-File API?
● Standard API for parsing,
generating, and transforming
Java class files
● Aim is to replace the bytecode
manipulation framework ASM
● API that evolve together with
the class-file format
16
JEP 454: Foreign Function &
Memory API
17
💾 Foreign Function
& Memory API
Replace JNI with a concise,
readable, and pure-Java API
Efficiently invoking foreign
functions
(i.e., code outside the JVM)
Safely accessing foreign memory
(i.e., memory not managed by the
JVM)
Wrap native libs in Java -
Don’t rewrite them
18
JEP 423: Region Pinning for G1
19
JEP 447: Statements before super(...)
(Preview)
20
Constructor restrictions (up to now)
21
Constructor restrictions (up to now)
22
Allowed: Code before
super(...) and this(...)
That code before is called
the “prologue”
● must not read any
fields of the class
● must not call any non-
static methods of the
class.
● It must also not create
instances of non-static
inner classes
23
JEP 459: String Templates
(Second Preview)
24
String composition solutions
25
String Template solution
26
RAW template
27
Formatter template
28
Custom templates (processors)
29
Custom templates (processors)
30
🔎 More detailed view
https://www.youtube.com/watch?v=dGo_QekdU5E&t=116s
31
JEP 461: Stream Gatherers
(Preview)
32
🔧 Stream API
Intermediate
operations
Terminal
operations
E.g. map(...), filter(...), and
limit(...) and more
collect(Collectors.toMap(...))
count(), anyMatch(...)
and more
You could implement own terminal
operation using Collector interface
Custom intermediate
operations?????
33
Stream Gatherer
34
Gatherer interface
Gatherer<T,A,R>
T - the type of input elements
A - the potentially mutable state type of the
gatherer operation
R - the type of output elements
Supplier<A> initializer();
● creation of a new, potentially mutable, state
Integrator<A, T, R> integrator();
● integrating a new input element to downstream
BinaryOperator<A> combiner();
● can be parallelized, merge partial result into one
BiConsumer<A, Downstream<? super R>>
finisher();
● performing an optional final operation, when
there are not more elements
35
📽️ Let’s try it out
36
Stream API after JDK22
37
JEP 462: Structured Concurrency
(Second Preview)
38
Regular way
39
Structured way
ShutdownOnFailure
ShutdownOnSuccess
CustomTaskScope
40
JEP 464: Scoped Values
(Second Preview)
41
🍪 Scoped Values
42
🍪 Scoped Values: key-points
preferred to ThreadLocal for virtual threads
immutable data sharing
bounded lifetime
smaller footprint and complexity
43
JEP 463: Implicitly Declared Classes and
Instance Main Methods
(Second Preview)
44
Instance Main Methods
45
Implicitly Declared Classes
MORE!
46
JEP 458: Launch Multi-File
Source-Code Programs
47
Simple java app launch
Since JDK11 we could execute .java source files directly, without an explicit
compilation step
$ java NewMainApp.java
48
Multiple files java app launch
$ java NewMainApp.java
Because it’s JDK22
49
Multiple files java app launch and some lib
$ java --source 22 --enable-preview -cp "libs/*" NewMainApp.java
50
JEP 460: Vector API
(Seventh Incubator)
52
API updates
🍪 ListFormat class
53
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, and SUNDAY
🍪 ListFormat class
54
🌐 dev.java: Java 22 is already there
55
https://dev.java/playground/
🍿 Not netflix but. Launch Stream
56
https://www.youtube.com/watch?v=AjjAZsnRXtE
58
🔮 Java 23 Predictions
● JEP 467:
Markdown Documentation Comments
● JEP 466:
Class-File API (Second Preview)
● JEP 465:
String Templates
● JEP Draft 8325803:
Flexible Constructor Bodies (Second Preview)
● JEP Draft 8326878:
Vector API (Incubator)
● JEP Draft 8327844:
Stream Gatherers (Second Preview)
var nextLoc = new Point(2, 5);
Point finalLoc = nextLoc with { x = 0; };
● JEP 468:
Derived Record Creation (Preview)
59
OMilleR_98 oleh.melnyk.98 oleh-
melnyk
Demo
That’s all :)
Stay up to date!
60

Java 22_ Unwrapped: What You Need to Know.pptx

Editor's Notes

  • #21 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #22 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #23 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #25 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #26 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #27 var language = "Java"; var coffeeJUG = "CoffeeJUG"; StringTemplate greetingTmpl = RAW."Hello \{language} community! Welcome to \{coffeeJUG} event!"; String interpolatedResult = greetingTmpl.interpolate(); System.out.println(interpolatedResult); // Hello Java community! Welcome to CoffeeJUG event! var fragments = greetingTmpl.fragments(); System.out.println(fragments); // [Hello , community! Welcome to , event!] var values = greetingTmpl.values(); System.out.println(values); // [Java, CoffeeJUG]
  • #28 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #29 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #30 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #31 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #33 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #34 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #35 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #39  public Response handle() throws InterruptedException, ExecutionException { try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { Future<User> task1 = executor.submit(() -> findUser); Future<Order> task2 = executor.submit(() -> findOrder); var userInfo = task1.get(); // join findUser var orderInfo = task2.get(); // join findOrder return new Response(userInfo, orderInfo); } } public Response handle() throws InterruptedException, ExecutionException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { StructuredTaskScope.Subtask<User> task1 = scope.fork(() -> findUser); StructuredTaskScope.Subtask<Order> task2 = scope.fork(() -> findOrder); scope.join(); scope.throwIfFailed(); return new Response(task1.get(), task2.get()); } }
  • #40  public Response handle() throws InterruptedException, ExecutionException { try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { Future<User> task1 = executor.submit(() -> findUser); Future<Order> task2 = executor.submit(() -> findOrder); var userInfo = task1.get(); // join findUser var orderInfo = task2.get(); // join findOrder return new Response(userInfo, orderInfo); } }
  • #42 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #43 var language = "Java"; var coffeeJUG = "CoffeeJUG"; // 1. Simple concatenation var greeting1 = "Hello " + language + " community! Welcome to " + coffeeJUG + " event!"; // 2. StringBuffer and StringBuilder var greeting2 = new StringBuilder() .append("Hello ").append(language) .append(" community! Welcome to ") .append(coffeeJUG).append(" event!") .toString(); // 3. String::format and String::formatted var greeting3 = "Hello %s community! Welcome to %s event!".formatted(language, coffeeJUG); // 4. java.text.MessageFormat var greeting4 = MessageFormat.format("Hello {0} community! Welcome to {1} event!", language, coffeeJUG);
  • #52  List<String> weekdays = Arrays.stream(DayOfWeek.values()).map(Objects::toString).toList(); ListFormat listFormatter = ListFormat.getInstance(Locale.US, ListFormat.Type.STANDARD, ListFormat.Style.SHORT); System.out.println(listFormatter.format(weekdays));
  • #54  List<String> weekdays = Arrays.stream(DayOfWeek.values()).map(Objects::toString).toList(); ListFormat listFormatter = ListFormat.getInstance(Locale.US, ListFormat.Type.STANDARD, ListFormat.Style.SHORT); System.out.println(listFormatter.format(weekdays));
  • #55  List<String> weekdays = Arrays.stream(DayOfWeek.values()).map(Objects::toString).toList(); ListFormat listFormatter = ListFormat.getInstance(Locale.US, ListFormat.Type.STANDARD, ListFormat.Style.SHORT); System.out.println(listFormatter.format(weekdays));