diff --git a/build.sh b/build.sh index 5e5f5b5..b0662ea 100755 --- a/build.sh +++ b/build.sh @@ -3,4 +3,6 @@ mkdir -p bin && javac -d bin snippets/*.java marp slides.md -o slides.html -marp slides.md -o slides.pdf \ No newline at end of file +marp slides.md -o slides.pdf + +xdg-open slides.html diff --git a/slides.md b/slides.md index 09b7290..5f90ff6 100644 --- a/slides.md +++ b/slides.md @@ -1,6 +1,6 @@ --- marp: true -title: Una mirada funciona a Java 21 +title: Una mirada funciona a Java 22 theme: gaia footer: #commitconf 2024 author: Antonio Muñoz @@ -9,7 +9,7 @@ backgroundImage: url('https://cdn.wallpapersafari.com/97/99/MnWulT.jpg') --- -# Una mirada :eyes: funcional a Java :two::one: +# Una mirada :eyes: funcional a Java :two::two: @@ -30,52 +30,46 @@ # Encuesta +* Java 22? :sunglasses: * Java 21? :thumbsup: * Java 17? :ok: * Java 11? :warning: * Todavía Java 8? :cry: * Y anteriores a Java 8? :exploding_head: - + --- # Jetbrains ecosystem survey * [¿Qué versión de Java usáis regularmente?](https://www.jetbrains.com/lp/devecosystem-2023/java/#java_versions) - - -| Version | Percentage| -|---------|-----------| -| Java8 | 50% | -| Java17 | 45% | -| Java11 | 38% | -| Java20 | 11% | +* Todavía el 50% usan Java 8 regularmente. --- # Java 8 -* Lanzado en 2014 :rocket: +* Lanzado en Marzo 2014 :rocket: +* No existía ni tiktok :notes: ni openai :robot: +* Ese mismo año se lanzó spring-boot v1.0. +* Docker y kubernetes daban sus primeros pasos. + JuanCar I abdicó en Felipe VI + Obama + Papa Francisco I desde 2013 + --> --- # Agenda :calendar: -* El largo camino a Java 21. +* El largo camino a Java 22. * Tipos de datos algebraicos. * Futuro. - - --- # Java Release Cadence :coffee: @@ -84,9 +78,12 @@ * Preview features. * They have a plan. + + --- -# Switch expressions +# Switch expressions :railway_track: ```java var value = switch (input) { @@ -98,15 +95,21 @@ * Incluido en Java 14. * Una nueva vida para `switch`. -* Una gran mejora en general para el lenguage. +* Expresión. + + --- -# Records +# Records :video_camera: ```java public record Movie(String title, int year, int duration) { - } ``` @@ -117,20 +120,56 @@ --- -# Sealed classes and interfaces +# Records: Constructor Canónico + + +```java +public record Movie(String title, int year, int duration) { + public Movie { + if (title == null || title.isEmpty()) { + throw new IllegalArgumentException(); + } + } +} +``` + +* Se ejecuta **siempre**. + + + +--- + +# Sealed classes and interfaces :closed_lock_with_key: ```java public sealed interface Shape { - record Square(int side) implements Shape {} record Rectangle(int weight, int height) implements Shape {} - record Circle(int radious) implements Shape {} - + record Circle(int radius) implements Shape {} } ``` * Incluido en Java 17. * Jerarquías de clases cerradas. +* `non-sealed` + +--- + +# non-sealed + +```java +public sealed interface Shape { + record Square(int side) implements Shape {} + record Rectangle(int weight, int height) implements Shape {} + record Circle(int radius) implements Shape {} + non-sealed interface CustomShape extends Shape {} +} +``` --- @@ -164,6 +203,26 @@ * Incluido en Java 21. * Deconstructores, nos permite acceder a los componentes de los objectos. + + +--- + +# Unnamed variables and patterns + +```java +var result = switch (obj) { + case Integer _ -> "int"; + case Long _ -> "long"; + case Double _ -> "double"; + case String _ -> "string"; + default -> "other"; +}; +``` + +* Incluido en Java 22. +* Mejora para el pattern matching. +* Eliminar verbosidad. + --- # Tipos de datos algebraicos @@ -337,24 +396,6 @@ --- -# Unnamed variables and patterns - -```java -var result = switch (obj) { - case Integer _ -> "int"; - case Long _ -> "long"; - case Double _ -> "double"; - case String _ -> "string"; - default -> "other"; -}; -``` - -* Incluido en Java 22. -* Mejora para el pattern matching. -* Eliminar verbosidad. - ---- - # Primitive types in patterns ```java diff --git a/snippets/List.java b/snippets/List.java index 9adf420..ee122db 100644 --- a/snippets/List.java +++ b/snippets/List.java @@ -4,6 +4,7 @@ import java.util.function.Predicate; sealed interface List { + record NonEmpty(T head, List tail) implements List {} record Empty() implements List {} diff --git a/snippets/Movie.java b/snippets/Movie.java index 50520f9..1826a5d 100644 --- a/snippets/Movie.java +++ b/snippets/Movie.java @@ -1,7 +1,10 @@ package snippets; -import java.util.UUID; +public record Movie(String title, int year, int duration) { -record Movie(UUID id) { - + public Movie { + if (title == null || title.isEmpty()) { + throw new IllegalArgumentException(); + } + } } diff --git a/snippets/Shape.java b/snippets/Shape.java index b00a3b0..be837a7 100644 --- a/snippets/Shape.java +++ b/snippets/Shape.java @@ -2,17 +2,16 @@ sealed interface Shape { + record Square(int side) implements Shape {} + record Rectangle(int weight, int height) implements Shape {} + record Circle(int radius) implements Shape {} + default double area() { var area = switch (this) { case Square(var side) -> side * side; case Rectangle(var weight, var height) -> weight * height; - case Circle(var radious) -> Math.PI * Math.pow(radious, 2); + case Circle(var radius) -> Math.PI * Math.pow(radius, 2); }; return area; } - - record Square(int side) implements Shape {} - record Rectangle(int weight, int height) implements Shape {} - record Circle(int radious) implements Shape {} - } diff --git a/snippets/Switches.java b/snippets/Switches.java index 0973c82..c4e9988 100644 --- a/snippets/Switches.java +++ b/snippets/Switches.java @@ -22,4 +22,14 @@ System.out.println(result); } + void method3(Object obj) { + var result = switch (obj) { + case Integer _ -> "int"; + case Long _ -> "long"; + case Double _ -> "double"; + case String _ -> "string"; + default -> "other"; + }; + } + }