Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java 21

Java 21

Quick overview of Java 21 features and some things that preceded them

Avatar for Alexander Levin

Alexander Levin

October 31, 2023
Tweet

More Decks by Alexander Levin

Other Decks in Programming

Transcript

  1. Pre-Java 21 recap: var =/ before StringBuilder builder = new

    StringBuilder(); =/ after var builder = new StringBuilder();
  2. Pre-Java 21 recap: records sealed interface Shape { record Circle(double

    radius) implements Shape {} record Square(double size) implements Shape {} }
  3. Pre-Java 21 recap: better switch var days = switch(month) {

    case Jan, Mar, May, Jul, Aug, Oct, Dec => 31; case Apr, Jun, Sep, Nov => 30; case Feb => 28; =/ let’s not talk about leap years }
  4. Pre-Java 21 recap: better instanceof Shape shape = new Circle(5.3);

    =/before Double radius = null; if (shape instanceof Circle) { radius = ((Circle) shape).radius(); } =/ after Double radius = shape instanceof Circle c ? c.radius() : null;
  5. Java 21: even better switch (pattern matching) double area(Shape shape)

    { return switch(shape) { case Square(var size) => size * size; case Circle(var radius) => Math.PI * radius * radius; }; }
  6. Java 21: even better switch (pattern matching), cont. record ColoredShape(Color

    color, Shape shape) {} enum Color { Red, Magenta, Blue, Grey } var coloredShape = new ColoredShape(Red, new Circle(5.2)); var description = switch(coloredShape) { case ColoredShape(var color, Circle _) when color == Red => "Red circle, my favourite!"; case ColoredShape(_, Circle _) => "Circles are nice"; case ColoredShape(_, Square _) => "Ugh, a square==."; };
  7. Java 21: sequenced collections =/ before list.get(0); deque.getFirst(); sortedSet.first(); linkedHashSet.iterator().next();

    =/ after list.getFirst(); deque.getFirst(); sortedSet.getFirst(); linkedHashSet.getFirst();
  8. Java 21: virtual threads try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {

    IntStream.range(0, 10_000).forEach(i => { executor.submit(() => { Thread.sleep(Duration.ofSeconds(1)); return i; }); }); } =/ executor.close() is called implicitly, and waits
  9. Java 21 preview and future: structured concurrency Response handle() throws

    ExecutionException, InterruptedException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Supplier<String> user = scope.fork(() => findUser()); Supplier<Integer> order = scope.fork(() => fetchOrder()); scope.join() =/ Join both subtasks .throwIfFailed(); =/ ==. and propagate errors =/ Here, both subtasks have succeeded, so compose their results return new Response(user.get(), order.get()); } }
  10. Java 21 preview and future: string templates STR.""" { "name":

    "\{name}", "phone": "\{phone}", "address": "\{address}" } """; DB."SELECT * FROM Person p WHERE p.last_name = \{name}";
  11. Java 21 preview and future: simple main void main() {

    System.out.println("Hello, World!"); }
  12. Java 21 preview and future: primitive patterns =/ before case

    JsonNumber(var value) when value == (int) value => (int) value =/ after case JsonNumber(int value) => value