2

Mis notas del curso :)

Este paradigma me cost贸 mucho al inicio, pero logre comprenderlo y a poder usarlo al menos en los retos del curso
Espero que les sirva 馃槂
Esta basado en funciones
Funciones es distinto a m茅todo
La funci贸n es un objeto que tiene ciertas cosas que la asemejan a un m茅todo
La diferencia es que es un objeto creado por la clase java.lang.function
Se usan funciones para almacenar datos, como si fueran variables
Funci贸n de orden mayor
Su resultado es una funci贸n
o se usa una funcion como parametro
Funci贸n pura
No depende de cosas externas
No genera efectos secundarios(no algo visible)
Una funci贸n pura no puede llamar a una impura
Funci贸n lambda (鈥榶鈥 al rev茅s)
Funci贸n an贸nima; es decir no tiene nombre
Para usarla una sola vez o en un solo lugar
Es muy simple (una linea mayormente)
Datos inmutables
No se alter
Facilita el uso de funciones puras y threads
Seguridad en los datos

Funciones
Una funci贸n simple(Function) se puede definir de este modo
returnData functionName(param){
toDo;
}
es lo mismo que:
Function<paramType, returnData> functionName = paramVar -> {to do};
Las llaves se recomiendan solo si se ocupa m谩s de una l铆nea.
Se invoca con functionName.try();
Predicate
recibe un tipo de dato y devuelve un boolean
Predicate<dataType> predicateName = param -> toDo;
Se invoca con predicateName.test;
Consumer
Recibe un solo dato, normalmente un objeto y no devuelve nada
Consumer<consumedData> consumerName = paramVar -> {toDO};
Se invoca con consumerName.accept();
Supplier
NO recibe nada, devuelve un dato, puede ser un objeto
Supplier<generatedData> suppliername = () -> {toDO};
Se invoca con supplierName.get();
Operators
El par谩metro (o los) son del mismo tipo
UnaryOperator- un solo parametro
BinaryOperator- dos (no estoy seguro si pueden ser m谩s)
Operator<dataType> operatorName = param(s) -> {toDO};
Se invoca con operatorName.apply();
BiFunction
Similar a Operators pero los datos no deben ser del mismo tipo
BiFunction<paramType1, paramType2, returnDataType> BiFunctionName = params -> {toDo};

Crear un propio tipo de funci贸n
Esto se hace definiendo un interfaz SAM
single abstract method que tiene un solo m茅todo abstracto
y se utiliza @FuntionalInterface justo antes de iniciar la interfaz
esto se hace de la siguiente forma

@FuntionalInterface
interface nombre<instancias de objetos>{
    (objeto que se retorna) methodName(params);
}
Se pueden hacer los m茅todos que deseemos 
Al usar default se puede hacer un body en
vez de solo instanciar los
Cuando instanciamos una funci贸n el valor que le demos de
retorno ser谩 el que tome el primer m茅todo y debe corresponder al tipo
de dato

Referenciar
Esto se usa en caso de utilizar un m茅todo como si fuera
una funci贸n para esto se usan los dos dos puntos ::
esto se usa en vez del punto ejemplo
System.out::println
El primero no es :: porque no hace referencia directa al m茅todo
Dependiendo del valor que regresa y los par谩metros que recibe puede ser
utilizado como cualquiera de las funciones
Por ejemplo System.out.println se puede usar como un consumidor porque recibe un par谩metro
y no devuelve nada al igual que el consumer

Chaining
Esto es llamar un m茅todo a partir de otro por ejemplo
objeto.metodo().metodo2().metodo3().metodo();
Para lograr esto todos los m茅todos (el 煤ltimo no necesariamente
devuelve el mismo objeto en vez de ser un void
y al devolverlo podemos usarlo para llamar otro metodo del mismo
objeto
Composici贸n
para componer funciones se usa compose y andthen
funci贸n.compose(lambda)
se ejecuta la lambda
funcion.andthen(lamba)
primero la lambda
Optional
Almacena alg煤n tipo de dato dentro de este objeto lo que nos ayuda
cuando el objeto no existe o es nulo
Streams
Los streams son una estructura de datos que sirve m谩s con la programaci贸n funcional debido
a que fueron creadas despu茅s por lo que podemos aplicar funciones
Solo se puede consumir un a vez
SU uso principal es simplificar operaciones como
filtrado mapeo y conversiones

Paralelismo
     Al ejecutar en java para hacer el proceso m谩s r谩pido el proceso se
    divide en los n煤cleos del procesador por lo que los datos pueden 
    llegar a salir en desorden para evitar esto se usa .paralell() y 
    .forEachOrdered()
Operaciones terminales
    Estos son m茅todos que alteran o interact煤an con el stream 
    pero que no devuelven otro stream por lo que ya no es posible 
    hacer m谩s Chaining
        
    anyMatch, allMAtch noneMatch 
        estas 3 eval煤an a los elementos del Stream
        con un Predicate sus restricciones las indica su nombre 
    findFirst , findAny
        Si est谩n ordenados previamente los datos del stream
        finFIrst retorna el primer dato y si no funciona como any
        devolvendo cualquier dato presente
        Devuelve un Optional
    min max
        estas eval煤an de dos en dos datos con el comparator(una lambda)
        y te da el valor de todo el stream ya sea el min o el max
    reduce
        binary accumulator
            aplica la operaci贸n a cada elemento
        valor BinaryOperator
            Aplica el Operator a los elementos y en caso de no haber retorna el valor
        binary function
            funciona parecido al anterior solo que puede generar un tipo distinto
    count 
        retorna el n煤mero de elementos en el stream
    toArray 
        devuelve un arreglo con los elementos del stream 
    collect
        convierte el stream en otra estructura de datos
    foreach 
        hace lo que indique el consumer a todos los datos

Operaciones intermedias
    Son operaciones que devuelven un stream por lo que permite hacer Chaining

    filter 
        Recibe un Predicate y eval煤a los elementos del stream 
        si devuelve true los conserva en el stream y si no los borra
    map 
        Recibe un a lambda , toma como valores los elementos del stream y 
        los reemplaza con los resultados
    flatMap
        es parecido  a map solo que puede lidiar con streams hechos de
         otras estructuras de datos
    distinct
        b谩sicamente  elimina los elementos duplicados con ayuda de equals
    limit
        solo permite que haya x elementos en el stream si est谩n en orden conserva los primeros
    peek
        Aplica un consumer a los elementos del stream
    skip
        es lo "contrario a limit" quita cierto n煤mero de elementos s贸lo que 
        skip cuenta cu谩ntos n煤meros quita y los que sobra se quedan
    sorted
         te permite ordenar junto con comparable
Escribe tu comentario
+ 2