diff --git a/slides.md b/slides.md new file mode 100644 index 0000000..91d85c0 --- /dev/null +++ b/slides.md @@ -0,0 +1,271 @@ +--- +marp: true +title: Una mirada funciona a Java 21 +theme: default +color: #fff +footer: #Commitconf 2024 +backgroundImage: url('https://cdn.wallpapersafari.com/97/99/MnWulT.jpg') +--- + +# Una mirada :eyes: funcional a Java :two::one: + + + +_Antonio Muñoz_ + +--- + +# ¿Quien soy? + +* Programo en Java desde Java 1.1. +* Actualmente trabajo en https://clarity.ai como backender. +* Mi primera charla en una conferencia. +* + +--- + +# Agenda :calendar: + +* El largo camino a Java 21. +* Tipos de datos algebraicos. +* Ejemplos. +* Futuro. + +--- + +# Java Release Cadence :coffee: + +* Dos release al año. +* Preview features. +* They have a plan. + +--- + +# Switch expressions + +* Incluido en Java 14. +* Una nueva vida para `switch`. +* Una gran mejora en general para el lenguage. + +```java +var value = switch (input) { + case "a" -> 1; + case "b" -> 2; + default -> 0; +}; +``` + +--- + +# Records + +* Incluido en Java 16. +* Muy esperado por la comunidad. +* Inmutables. + +```java +public record Movie(String title, int year, int duration) { + +} +``` + +--- + +# Sealed classes and interfaces + +* Incluido en Java 17. +* Jerarquías de clases cerradas. + +```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 {} + +} +``` + +--- + +# Pattern matching for switch + +* Incluido en Java 21. +* Exhaustiveness. + +```java +var result = switch (obj) { + case Integer i -> String.format("int %d", i); + case Long l -> String.format("long %d", l); + case Double d -> String.format("double %f", d); + case String s -> String.format("String %s", s); + default -> obj.toString(); +}; +``` + +--- + +# Record patterns + +* Incluido en Java 21. +* Deconstructores, nos permite acceder a los componentes de los objectos. + +```java +var area = switch (shape) { + case Square(var side) -> side * side; + case Rectangle(var weight, var height) -> weight * height; + case Circle(var radious) -> Math.PI * radious^2; +} +``` + +--- + +# Tipos de datos algebraicos + +* AKA ADTs (algebraic data types) +* Viene de las matemáticas. +* Productos y sumas de tipos. +* Recursivo. + +--- + +# Tipos de datos algebraicos (II) + +* Podemos representarlos en Java. +* Un `record` es un producto de tipos. +* Un `sealed interface` es una suma de tipos. + +```java +public sealed interface Tree { + + record Node(String value, Tree left, Tree right) implements Tree { } + record Leaf(String value) implements Tree {} + +} +``` + +--- + +# Tipos de datos algebraicos (III) + +* Podemos representar `Optional` con ADTs + +```java +public sealed interface Optional { + + record Empty() implements Optional { } + record Present(T value) implements Optional {} + +} +``` + +--- + +# Ejemplo + +* ¿Pero eso para qué me sirve? +* Manejo de errores. + +--- + +# Próximamente :watch: + + + +--- + +# Unnamed variables and patterns + +* Incluido en Java 22. +* Mejora para el pattern matching. +* Eliminar verbosidad. + +```java +var result = switch (obj) { + case Integer _ -> "int"; + case Long _ -> "long"; + case Double _ -> "double"; + case String _ -> "string"; + default -> "other"; +}; +``` + +--- + +# Primitive types in patterns + +* Preview en Java 23. + +```java +var result = switch (obj) { + case int i -> String.format("int %d", i); + case long l -> String.format("long %d", l); + case double d -> String.format("double %f", d); + case String s -> String.format("String %s", s); + default -> obj.toString(); +}; +``` + +--- + +# Bola de cristal :crystal_ball: + + + +--- + +# Derived Record Creation + +* Draft. +* AKA withers. + +```java +Point newPoint = oldPoint with { + x *= 2; + y *= 2; +}; +``` + +--- + +# Member patterns + +* Early work. +* AKA deconstructors. +* Mejora para pattern matching. +* Cualquier clase. + +--- + +# ¿Qué falta todavía? + +* ADTs son recursivos. +* Tail recursion. +* Soporte para tipos de datos primitivos para genericos. + +--- + +# ¿Preguntas? + + + +--- + +# ¡Gracias! + + + +* Mastodon: @tonivade@jvm.social +* Github: https://github.com/tonivade + +--- + +# JEPs + +- [Switch expressions](https://openjdk.org/jeps/361) 14 +- [Records](https://openjdk.org/jeps/395) 16 +- [Sealed Classes and interfaces](https://openjdk.org/jeps/409) 17 +- [Pattern matching for switch](https://openjdk.org/jeps/441) 21 +- [Record patterns](https://openjdk.org/jeps/440) 21 +- [Unnamed variables and patterns](https://openjdk.org/jeps/456) 22 +- [Primitive types in patterns](https://openjdk.org/jeps/455) 23 (1st preview) \ No newline at end of file