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

Más allá de Java 8, el enfoque funcional y Spri...

Más allá de Java 8, el enfoque funcional y Spring WebFlux

ava ha sido uno de los lenguajes de programación más populares en la comunidad de desarrollo en las últimas decadas, sin embargo el paradigma funcional ha tomado gran acogida en el mundo del software debido a los grandes beneficios que ofrece. Oracle no se ha quedado atrás y a partir de nuevas versiones de Java ha incluido capacidades funcionales al popular lenguaje, tales como interfaces funcionales y expresiones lambda. En esta sesión veremos cómo lograr un enfoque funcional en Java 11 y cómo utilizar todas sus ventajas en una aplicación Web con Spring WebFlux.

Quito Lambda

May 29, 2019
Tweet

More Decks by Quito Lambda

Other Decks in Programming

Transcript

  1. Por que Java? • Comunidad • Popularidad • Frameworks y

    librerías (Spring, Hibernate, etc.) • Más características desde Java 8+
  2. El plan de Oracle con Java • Java SE 8

    ◦ Proceso de finalización de de actualizaciones públicas. ◦ Actualizaciones hasta diciembre 2020 • LTS y non-LTS ◦ Nueva versión LTS de Java cada 3 años ◦ Nueva version non-LTS de Java cada 6 meses ◦ Java SE 11 es la actual versión LTS ◦ Java SE 12 actual non-LTS hasta septiembre 2019
  3. Principios de la programación funcional • Funciones Puras • Inmutabilidad

    • Transparencia referencial • Funciones como ciudadanos de primer orden • Funciones de orden superior
  4. Funciones Puras Una función es pura cuando siempre genera el

    mismo resultado para los mismos argumentos
  5. Inmutabilidad El estado no cambia una vez que fue creado.

    En su lugar, creamos un nuevo objeto con un nuevo estado
  6. Transparencia referencial Si una función consistentemente entrega el mismo resultado

    para la misma entrada de datos, es referencialmente transparente. En otras palabras: Funciones Puras + Inmutabilidad = Transparencia Referencial
  7. Funciones como ciudadanos de primer orden • Ciudadano de primer

    orden: Es un entidad que permite todas las operaciones disponibles: • Métodos vs. funciones • La anotación @FuncionalInterface • Expresiones Lambda • Tipos genéricos (repaso) • Interfaces funcionales Lambda incorporadas
  8. Expresiones Lambda Sintaxis completa: (Type arg1, Type arg2, ...) ->

    { //implementacion }; Sintaxis simplificada: (arg1, arg2, ...) -> valorRetorno;
  9. Interfaces funcionales Lambda incorporadas Predicate<T>: (T t) -> boolean; Consumer<T>:

    (T t) -> void; Supplier<T>: () -> T; Function<T, R>: (T t) -> R; UnaryOperator<T>: (T t) -> T; BiFunction<T, U, R>: (T t, U u) -> R; BinaryOperator<T>: (T t1, T t2) -> T; // Y algunas variaciones más...
  10. Funciones de orden superior Toman una o más funciones como

    parámetro, y/o retornar una función como resultado.
  11. ⚠ java.lang.NullPointerException • En Java null es parte de todos

    los typos • Manejo seguro de valores nulos • Método clásico: if (foo == null) return 0; • Método funcional: Optional.of(foo).orElse(0); Optional.of(bar).orElseThrow(); // NoSuchElementException
  12. Optional<T> Optional<String> foo = Optional.of(“foo”); Optional<String> foo = Optional.ofNullable(arg1); Integer

    baz = Optional.ofNullable(arg1) .map(arg1 -> arg1.getBar()) .map(bar -> bar.getBaz()) .or(() -> arg2); if (foo.isPresent() && !foo.isEmpty()) { System.out.println(foo); // Optional<String>[foo] System.out.println(foo.get()); // “foo” }
  13. Optional<T> List<Integer> nums = Arrays.asList(1, 5, -3, 2, 7, -1,

    -6, 9); List<Integer> positives = Optional.of(nums) .filter(n -> n >= 0) .orElse(new ArrayList<Integer>()); Class Person { private Optional<String> name; // constructores // getter... } Optional<String> optionalName = Optional.ofNullable(person) .map(person -> person.getName()); String name = Optional.ofNullable(person) .flatMap(person -> person.getName());
  14. Spring WebFlux • Mientras que Spring MVC (servlets) es bloqueante,

    Spring WebFlux (Netty) no bloquea el hilo principal • Debemos mantener una filosofía reactiva (Reactive Java): ◦ Optional<T> ◦ Mono<T> ◦ Flux<T> • Routers (no Controllers) son funcionales • Spring MVC @RestController vs. Spring WebFlux RouterFunction