SlideShare una empresa de Scribd logo
Programación Funcional en Java 8
Por: Ing. Sergio Rubén Irigoyen Guerra
Historia
Historia
●

Clases Internas Anónimas
JButton button = new Jbutton("Haga click aquí.");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
});
Historia
●

Clases Internas Anónimas
JButton button = new Jbutton("Haga click aquí.");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
});
Clase interna
anónima
Historia
●

Clases Internas Anónimas
JButton button = new Jbutton("Haga click aquí.");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
});
Sintaxis difícil
de manejar

Clase interna
anónima
Historia
●

Clases Internas Anónimas
JButton button = new Jbutton("Haga click aquí.");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
});
Sintaxis difícil
de manejar

Clase interna
anónima

Problema de
“verticalidad”
Interfaces Funcionales
Interfaces Funcionales
●

Una interfaz que tiene exactamente un método abstracto
Interfaces Funcionales
●

Una interfaz que tiene exactamente un método abstracto
–

Runnable

–

Comparator

–

Comparable

–

ActionListener

–

EventHandler
Interfaces Funcionales

public interface Runnable {
public abstract void run();
}
Interfaces Funcionales

Nueva anotación
en Java 8

@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Interfaces Funcionales

Nueva anotación
en Java 8

No es necesaria,
pero es útil

@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Expresiones Lambda
Expresiones Lambda

() ­> {};
Parámetros
de entrada
Expresiones Lambda

() ­> {};
Parámetros
de entrada

Bloque de código
Expresiones Lambda

Un sólo
parámetro

(String s) ­> {};
(String s, Algo c) ­> {};
Expresiones Lambda

Un sólo
parámetro

(String s) ­> {};
(String s, Algo c) ­> {};
Múltiples parámetros,
separados por comas.
Expresiones Lambda

Bloque de código

(String s) ­> {System.out.println(s);};
Expresiones Lambda

Bloque de código

(String s) ­> {System.out.println(s);};
(String s) ­> System.out.println(s);
Se pueden omitir
las llaves en
ciertos casos
Expresiones Lambda

(String nombre) ­> {
String saludo = "Hola " + nombre;
System.out.println(saludo);
}
Bloque de código
con múltiples
instrucciones
Expresiones Lambda

public interface Comparator<T> {
int compare(T o1, T o2);
}
Interface
Comparator
Expresiones Lambda

Comparator<String> comp = (String s1, String s2) ­> 
s1.compareTo(s2);
int result = comp.compare("Argentina", "Aruba");
Implementación
usando una
expresión lambda
Expresiones Lambda

Comparator<String> comp = (String s1, String s2) ­> 
s1.compareTo(s2);
int result = comp.compare("Argentina", "Aruba");

Usando la expresión
lambda para obtener
un resultado
Expresiones Lambda

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
});
button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));
Expresiones Lambda

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("Click.");
}
Clase interna
});
anónima
button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));
Expresión
lambda
Inferencia de Tipos
Inferencia de Tipos

button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));
Inferencia de Tipos

button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));

button.addActionListener(e ­> 
System.out.println("Click."));
Inferencia de Tipos

button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));
Tipo
Inferido

button.addActionListener(e ­> 
System.out.println("Click."));
Inferencia de Tipos

button.addActionListener((ActionEvent e) ­> 
System.out.println("Click."));
Tipo
Inferido

button.addActionListener(e ­> 
System.out.println("Click."));
Se pueden
omitir los
paréntesis
Inferencia de Tipos

Comparator<String> comp = (String s1, String s2) ­> 
s1.compareTo(s2);

Comparator<String> comp = (s1, s2) ­> s1.compareTo(s2);
Inferencia de Tipos

Comparator<String> comp = (String s1, String s2) ­> 
s1.compareTo(s2);
Tipos
Inferidos
Comparator<String> comp = (s1, s2) ­> s1.compareTo(s2);
Alcance léxico
Alcance léxico
public class ScopeTest {
    public static void main(String[] args) {
        ScopeTest j = new ScopeTest();
        j.hacer();
    }
    public void hacer() {
        Runnable r = () ­> System.out.println(toString()); 
        r.run();
        Runnable r2 = new Runnable() {
            @Override
            public void run() {
                System.out.println(toString());
            }
        };
        r2.run();
    }
    
    @Override
    public String toString(){
        return "Test";
    }
}
Alcance léxico
public class ScopeTest {
    public static void main(String[] args) {
        ScopeTest j = new ScopeTest();
        j.hacer();
    }
    public void hacer() {
        Runnable r = () ­> System.out.println(toString()); 
        r.run();
        Runnable r2 = new Runnable() {
            @Override
            public void run() {
                System.out.println(toString());
            }
        };
Imprime
        r2.run();
“ScopeTest$1@5acf9800”
    }
    
    @Override
    public String toString(){
        return "Test";
    }
}
Alcance léxico
public class ScopeTest {
    public static void main(String[] args) {
        ScopeTest j = new ScopeTest();
        j.hacer();
    }
    public void hacer() {
        Runnable r = () ­> System.out.println(toString()); 
        r.run();
        Runnable r2 = new Runnable() {
Imprime
            @Override
“Test”
            public void run() {
                System.out.println(toString());
            }
        };
Imprime
        r2.run();
“ScopeTest$1@5acf9800”
    }
    
    @Override
    public String toString(){
        return "Test";
    }
}
Referencias a métodos
Referencias a métodos

public abstract void run();

public static void imprime(){
System.out.println("Funciona");
}
Referencias a métodos

public abstract void run();
Mismo tipo
Imprime
de“Test”
retorno

public static void imprime(){
System.out.println("Funciona");
}
Referencias a métodos

public abstract void run();
Mismo tipo
Imprime
de“Test”
retorno

Mismos
parámetros

public static void imprime(){
System.out.println("Funciona");
}
Referencias a métodos

public abstract void run();
Mismo tipo
Imprime
de“Test”
retorno

Mismos
parámetros

public static void imprime(){
System.out.println("Funciona");
}

le
atib
p
om
c
rma
Fi
Referencias a métodos

public class MethodReferenceTest {
public static void main(String[] args) {
Runnable r2 = MethodReferenceTest::imprime;
r2.run();
}
public static void imprime(){
System.out.println("Funciona");
}
}
Referencias a métodos

public class MethodReferenceTest {
public static void main(String[] args) {
Runnable r2 = MethodReferenceTest::imprime;
r2.run();
}
public static void imprime(){
System.out.println("Funciona");
}
}

Referencia a
método
Interfaces Funcionales
Predefinidas en Java 8
Interfaces funcionales predefinidas en Java 8
●

java.util.function
–

Consumer<T>  argumento tipo T y no retorna ningún
resultado

–

Function<T, R>  argumento tipo T y retorna un
resultado tipo R

–

Supplier<T>  sin argumentos y retorna un
resultado tipo T

–

Predicate<T>  argumento tipo T y retorna un
resultado tipo boolean
Métodos de extensión virtuales
Métodos de extensión virtuales
●

Método forEach de la interfaz Iterable
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Métodos de extensión virtuales
●

Método forEach de la interfaz Iterable
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Método
default
Métodos de extensión virtuales
●

Método forEach de la interfaz Iterable
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
Consumer es una
}
Interfaz funcional
Métodos de extensión virtuales

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) && other.test(t);
    }
    default Predicate<T> negate() {
        return (t) ­> !test(t);
    }
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) || other.test(t);
    }
}
Métodos de extensión virtuales

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);

Un sólo
Método
abstracto

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) && other.test(t);
    }
    default Predicate<T> negate() {
        return (t) ­> !test(t);
    }
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) || other.test(t);
    }
}
Métodos de extensión virtuales

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) && other.test(t);
    }
    default Predicate<T> negate() {
        return (t) ­> !test(t);
    }

Métodos
default

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) ­> test(t) || other.test(t);
    }
}
Streams
Streams
●

Operaciones en Streams
–

Terminales
● count()
● forEach() 

–

Intermedias
● filter() 
● distinct() 
Streams
●

Operaciones en Streams
–

Terminales
● count()
● forEach() 

–

Intermedias
● filter() 
● distinct() 

Lazy
(flojas)
Streams
●

Operaciones en Streams
–

–

Terminales
● count()
● forEach() 
Intermedias
● filter() 
● distinct() 

Eager
(ansiosas)

Lazy
(flojas)
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = s ­> s >= 50;
Predicate<Integer> sm7 = s ­> s <= 70;
long b = numeros.stream().filter(sm5.and(sm70)).count();
System.out.println("Resultado: " + b);
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}

Lista con cien
numeros entre
0 y 100

Predicate<Integer> sm5 = s ­> s >= 50;
Predicate<Integer> sm7 = s ­> s <= 70;
long b = numeros.stream().filter(sm5.and(sm70)).count();
System.out.println("Resultado: " + b);
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = s ­> s >= 50;
Predicate<Integer> sm7 = s ­> s <= 70;
long b = numeros.stream().filter(sm5.and(sm70)).count();
System.out.println("Resultado: " + b);

Obtenemos el
Stream
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = s ­> s >= 50;
Predicate<Integer> sm7 = s ­> s <= 70;
long b = numeros.stream().filter(sm5.and(sm70)).count();
System.out.println("Resultado: " + b);

filter() recibe un
Predicate como
parámetro
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = i ­> i >= 50;
Predicate<Integer> sm7 = i ­> i < 70;

Creamos dos Predicates
utilizando expresiones lambda

long b = numeros.stream().filter(sm5.and(sm70)).count();
System.out.println("Resultado: " + b);

filter() recibe un
Predicate como
parámetro
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = i ­> i >= 50;
Predicate<Integer> sm7 = i ­> i < 70;
long b = numeros.stream().filter(sm5.and(sm7)).count();
System.out.println("Resultado: " + b);

Utilizamos el método default
and() de Predicate
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = i ­> i >= 50;
Predicate<Integer> sm7 = i ­> i < 70;
long b = numeros.stream().filter(sm5.and(sm7)).count();
System.out.println("Resultado: " + b);

Contamos el número
de elementos
Streams
●

Si tenemos una lista con cien numeros entre 0 y 100, y queremos obtener la
cantidad de números que sean mayores o iguales a 50 y menores a 70, podemos
hacerlo de la siguiente forma usando Streams y expresiones lambda:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
    numeros.add(rnd.nextInt(100));
}
Predicate<Integer> sm5 = i ­> i >= 50;
Predicate<Integer> sm7 = i ­> i < 70;
long b = numeros.stream().filter(sm5.and(sm7)).count();
System.out.println("Resultado: " + b);

Mostrar el resultado
Streams
●

Optimización:

List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
rnd.ints(100, 0, 100).forEach(numeros::add);
Predicate<Integer> sm5 = i ­> i >= 50;
Predicate<Integer> sm7 = i ­> i < 70;

Convertir a Stream
y expresiones lambda

long b = numeros.stream().filter((i) ­> (i>=50 && i<70)).count();
System.out.println("Resultado: " + b);
Streams
●

Java 7 vs Java 8:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
numeros.add(rnd.nextInt(100));
}      
int count = 0;
for (Integer i : numeros) {
if(i>=50 && i<70){
count++;
}
}

Java 7

rnd.ints(100, 0, 100).forEach(numeros::add);
long b = numeros.stream().filter(i ­> i>=50 && i<70).count();
System.out.println("Resultado Java7: " + count);
System.out.println("Resultado Java8: " + b);
Streams
●

Java 7 vs Java 8:
List<Integer> numeros = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 100; i++) {
numeros.add(rnd.nextInt(100));
}      
int count = 0;
for (Integer i : numeros) {
if(i>=50 && i<70){
count++;
}
}

Java 7

Java 8

rnd.ints(100, 0, 100).forEach(numeros::add);
long b = numeros.stream().filter(i ­> i>=50 && i<70).count();
System.out.println("Resultado Java7: " + count);
System.out.println("Resultado Java8: " + b);
Preguntas
¡Gracias!

Más contenido relacionado

Similar a Java8

Prac6
Prac6Prac6
In 21
In 21In 21
Botones swing 14 11-2012
Botones swing 14 11-2012Botones swing 14 11-2012
Botones swing 14 11-2012
cruz1793
 
Curso java desde cero nivel i - modulo v
Curso java desde cero   nivel i - modulo vCurso java desde cero   nivel i - modulo v
Curso java desde cero nivel i - modulo v
Giovanny Guillen
 
Practica 6
Practica 6Practica 6
Practica 6
NEQUIZ URIEL
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4
Robert Wolf
 
12swing gui
12swing gui12swing gui
12swing gui
Oscar Sanchez
 
Mp mardoqueo informe tecnico tap
Mp mardoqueo informe tecnico tapMp mardoqueo informe tecnico tap
Mp mardoqueo informe tecnico tap
Mardoqueo Mateo Pedro
 

Similar a Java8 (8)

Prac6
Prac6Prac6
Prac6
 
In 21
In 21In 21
In 21
 
Botones swing 14 11-2012
Botones swing 14 11-2012Botones swing 14 11-2012
Botones swing 14 11-2012
 
Curso java desde cero nivel i - modulo v
Curso java desde cero   nivel i - modulo vCurso java desde cero   nivel i - modulo v
Curso java desde cero nivel i - modulo v
 
Practica 6
Practica 6Practica 6
Practica 6
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4
 
12swing gui
12swing gui12swing gui
12swing gui
 
Mp mardoqueo informe tecnico tap
Mp mardoqueo informe tecnico tapMp mardoqueo informe tecnico tap
Mp mardoqueo informe tecnico tap
 

Más de Software Guru

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
Software Guru
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
Software Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
Software Guru
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
Software Guru
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
Software Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
Software Guru
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
Software Guru
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
Software Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
Software Guru
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
Software Guru
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
Software Guru
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
Software Guru
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
Software Guru
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Software Guru
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
Software Guru
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Software Guru
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
Software Guru
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
Software Guru
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
Software Guru
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
Software Guru
 

Más de Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Último

Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
MiguelAtencio10
 
La Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docxLa Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docx
luiscohailatenazoa0
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
AbrahamCastillo42
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
YashiraPaye
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
mantenimientocarbra6
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
yuberpalma
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
70244530
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
KukiiSanchez
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
AMADO SALVADOR
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
AngelCristhianMB
 
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
gisellearanguren1
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
El uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptxEl uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptx
jgvanessa23
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
Manuel Diaz
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
codesiret
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
leia ereni
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
cecypozos703
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
al050121024
 

Último (20)

Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
Mantenimiento de sistemas eléctricos y electrónicosarticles-241712_recurso_6....
 
La Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docxLa Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docx
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
 
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
El uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptxEl uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptx
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
 

Java8