Lamdas Flashcards
Que es una expresion lambda
Es una interfaz que puede o no estat anotada con @FunctionalInterface, si lo esta el compilador verificara que cumpla con las siguientes reglas:
- Solo debe de constar de un metodo abstracto
- Adicional puede contar con cero o muchos metodos estaticos
- cero o muchas metodos default,
Debemos considerar que los metodos propios de la clase Object se excluyen de estas reglas, es decir no cuentan como metodos de una functional interface, aunque no debemos de modificarlos, una lamda no debe modificar los metodos heredados de Object
Como se podia hacer el comportamiento de una lambda antes de java 8
Por medio de implementar una clase anonima
Cual es la ventaja de las expresiones lamdas comparado con las clases anonimas
Las lamdas son:
- faciles de leer y de escribir
- se pueden pasar como funcionalidad en muchos lugares como si fuera un metodo comun pero pasamos funcionalidad en lugar de datos u objetos
- Se procesan en paralelo si tenemos un ambiente multicore
Cuales son los pasos para pasar una clase anonima a una lamda normal
- Primero tomamos la seccion de los parametros, estos pueden ser cero o varios parametros, basicamente todo lo que esta entre parentesis, opcionalmente podemos omitir el tipado de los parametros ya que como al ser una interfaz funcional solo tiene un metodo y con eso el compilador puede inferir el tipo sin que nosotros lo especifiquemos
- Ponemos el simbolo -> esta es la notacion que usan las lamdas
- Tomamos todo lo que esta entre llaves {} removiendo el return si aplica, si tiene mas de una linea tenemos que ponerlo dentro de {} si solo es una linea podemos omitir las {}
En que lugar se pueden ocupar lambdas
En parametros de entrada y como tipos de salida(return)
Que tipo de objeto es una lamda
Es un objeto sin identidad, la diferencia entre una clase anonima y yna lamda es que para crear una clase anonima necesitamos usar new, lo cual implica que debemos realizar todo el proceso de inicializacion de un objeto comun y corriente
- Memoria
- CleanUp
- ejecutar inicializadores estaticos
- bloques estaticos
- inicilizadores no estaticos
- no estatic blocks
- constructor
y con una expresion lamda no, en ese sentido es mas eficiente utilizar lamdas ya que no tenemos ese overhead
Cuales son los tipos de lamdas
- Supplier: no toma ningun objeto y retorna una nueva instancia de T, ejemplo: T get()
- Consumer: acepta un objeto y no regresa nada, ejemplo: void accept(T t)
- Bi-Consumer: acepta dos objetos y no regresa nada, ejemplo void accept(T t, R r)
- Predicate: Toma un objeto y nos regresa un boleano, ejemplo: boolean test(T t)
- Bi-Predicate: acepta dos objetos y regresa un boleano, ejemplo boolean test(T t, R r)
- Function: Toma un objeto y regresa un objeto de otro tipo, ejemplo: R apply(T t)
- Bi-Function: Toma dos objetos y nos regresa otro de otro tipo, ejemplo; R apply(T t,R r)
- UnaryOperator: Recibe un objeto y regresa otro del mismo tipo, ejemplo R accept(R r)
- BinaryOperator: Recibe 2 objetos y regresa otro del mismo tipo, ejemplo R accept(R r, R r)
Con que otra notacion se pueden crear las lamdas
Se llama method reference y es un shortcut los pasos son los siguientes
Omitir la parte de los parametros, es decir los parentesis()
Ponemos parte de los simbolos ->
Llamamos el metodo por medio de :: ejemplo System.out::println
Un ejemplo quedaria asi Comparator s = num -> Integer::compare
Cabe señalar que NO soportan argumentos por ejemplo m.age>20 se tendria que hacer con la notacion normal
Cuales son los metodos default y metodos estaticos en Java 8
Son metodos los cuales podemos o no tener en una interfaz funcional y loque se hace es que se implementan directamente en la interfaz, esto se realizo asi debido a que de esta manera se no se rompe la backward compatibility, imaginemos que agregabamos un metodo a la interfaz List, esto haria que todas nuestras versiones tuvieran que implementarlo, al hacer metodos default nos permite agregar ese metodo y tenerlo sin necesidad de implementarlo y romper el contrato, al igual podemos tener cero o muchos metodos estaticos en una interfaz y se comportara de la misma manera que un metodo estatico en una clase
Describe el patron map/filter/reduce
Es un patron que nos permite procesar nuestra informacion, imaginemos que tenemos una lista de personas que tengan entre 20 y 25 años entre las personas contenidas en la lista,la descripcion seria la siguiente:
- Map: en esta paso vamos a pasar la lista de personas a una lista de enteros por medio de su edad, el chiste de este paso es que si tenemos 10 elementos persona en la lista, lo mapemos a 10 elementos enteros (este paso a veces es omitido y se realiza directamente en el filtrado)
- Filter: una vez que tenemos la lista de enteros los filtramos, quitando las personas que no cumplan con nuestro predicado, en este caso si teniamos 10 enteros, podemos acabar con menos dependiendo de si cumplen o no el predicado, pero aqui se puede reducir
- Reduce: esto lo podemos ver como un tipo agregation de sql, por ejemplo sumar todos los resultantes, sacar el promedio, etc para al final solo terminar con un numero que represente nuestro requerimiento
Que es un stream
Tecnicamente es una interfaz generica,
- se utilizan para el procesamiento de la informacion
- No se deben de modificar(la info que se esta procesando) ya que estan pensadas solo para lectura y no escritura auqnue nada nos lo impude
- Liberan el poder del procesamiento multicore y paralelismo
- Todo se hace en un solo pipelane, es decir que no existen operaciones intermedias, solo se tienen que encadenar
- No almacenan informacion por lo cual no tendra operaciones intermedias
- Nos ayuda a implementar el patron map/filter/reduce
- Es una api nueva que se puede usar por ejemplo en colecciones
- No se puede reutilizsar un stream, es decir si ya su ultimo elemento de la cadena es una operacion terminal, ya no se puede reutilizar
Si un stream no almacena informacion, entonces que es lo que pasa cuando un paso intermedio dentro de un map/filter/reduce regresa un stream?
No pasa nada, en realidad es solo una marca que indica que debe de continuar la ejecucion del siguiente paso, es decir es un paso intermedio y en el momento de que el siguiente paso es una operacion terminal, ese sera nuestro trigger para ejecutar todos los pasos, pero mientras haya pasos intermedios (que regresen un stream) continuarra ejecutando los pasos siguientes
Como podemos identificar una operacion final y una operacion intermedia
- Las operaciones intermedias nos regresan un stream
- Las operaciones finales nos regresan void o otra cosa que no sea stream
Cual es la diferencia entre un map y un flatmap
supongamos que tenemos las siguientes listas
a=[1,2,3,4]
b=[5,6]
c=[7,8,9]
en map seria asi [[1,2,3,4], [5,6], [7,8,9]]
en flatmap seria asi: [1,2,3,4,5,6,7,8,9]
***A que se refieran los optionals
- Es un wrapper como Integer a int pero este no puede estar vacio
- Que nos puede o no regresar algo,