Curso de

Java 8: lambdas y streams

www.devcode.la

www.devcode.la

INSTRUCTOR

  • Enrique Munguía
  • Software Engineer @Google
  • Twitter: @enrique7mc_
  • Blog: enrique7mc.com

www.devcode.la

OBJETIVOS

  • Aprender y aplicar algunas de las características más importantes de Java 8:
    • Expresiones lambda
    • Interfaces funcionales
    • API de Streams

REQUISITOS

  • Conceptos básicos de Java

  • Experiencia usando un IDE

www.devcode.la

Recomendado: IntelliJ Idea Community

Expresiones lambda

Novedades en Java 8

www.devcode.la

Permiten representar operaciones de forma simple.

Dependen de las nuevas interfaces funcionales.

La sintaxis incluye referencias de método y constructor.

API de Streams

Novedades en Java 8

www.devcode.la

Hacen más simple la manipulación de colecciones.

Especifican "cuál" es el resultado en lugar de "cómo" obtenerlo.

Incluye soporte para paralelización de operaciones.

Expresiones Lambda

www.devcode.la

Una expresión lambda es un bloque de código que puede incluir argumentos.

(ActionEvent e) -> System.out.println(e.getTarget())

(first, second) -> Integer.compare(first.length(), second.length());

() -> { 
  for (int i = 0; i < 10; i++) { 
    doWork();
  }
};

Expresiones Lambda

www.devcode.la

Sintaxis

// Sin argumentos
() -> { 
  for (int i = 0; i < 10; i++) { 
    doWork();
  }
};
() -> doWork();


// Un argumento
(String name) -> System.out.println(name);
(name) -> System.out.println(name);
name -> System.out.println(name);

// Múltiples argumentos
(int a, int b) -> {
  return a + b;
}
(int a, int b) -> a + b;
(a, b) -> a + b;

Expresiones Lambda

www.devcode.la

Interfaces funcionales

// Ejemplo Predicate
Predicate<String> stringLen  = (s) -> s.length() < 10;

// Ejemplo Consumer
Consumer<String> consumerStr = (s) -> System.out.println(s.toLowerCase());

// Ejemplo Function
Function<Integer,String> converter = (num) -> Integer.toString(num);

// Ejemplo Supplier
Supplier<String> s  = () -> "Java 8";

// Ejemplo Binary Operator
BinaryOperator<Integer> add = (a, b) -> a + b;

// Ejemplo Unary Operator
UnaryOperator<String> str  = (msg)-> msg.toUpperCase();

// Ejemplo Functional Interface
Action action = () -> System.out.println("Inside an action");

Expresiones Lambda

www.devcode.la

Referencias de método

// Referencia a un método estático
ContainingClass::staticMethodName

// Referencia al método de instancia de un objeto
containingObject::instanceMethodName

// Reference al método de instancia de un tipo en particular
ContainingType::methodName

// Referencia de constructor
ClassName::new

API de Streams

www.devcode.la

Los Streams permiten procesar colecciones de manera eficiente.

Se pueden crear a partir de colecciones, arreglos e iteradores.

Incluyen una gran variedad de métodos para ejecutar las operaciones más comunes.

API de Streams: transformaciones

www.devcode.la

El método filter permite incluir solo ciertos elementos

// ["hello", "java", "streams"]
words.filter(w -> w.length() > 5)
// ["streams"]

El método map permite transformar elementos

// ["hello", "world"]
words.map(String::toUppercase)
// ["HELLO", "WORLD"]

www.devcode.la

El método limit modifica el número de elementos

// [1, 2, 5, 6, 7, 9, 10]
numbers.limit(3)
// [1, 2, 5]

El método distinct remueve duplicados

// [1, 1, 2, 3, 3, 3]
numbers.distinct()
// [1, 2, 3]

El método sorted ordena los elementos

// [4, 2, 1, 3]
numbers.sorted()
// [1, 2, 3, 4]

API de Streams: transformaciones

API de Streams: operaciones terminales

www.devcode.la

El método count regresa el número de elementos

// [1, 2, 5, 6, 7, 9, 10]
numbers.count();
// 7

El método max regresa el mayor elemento

// [1, 0, 5, 3, 9, 3]
numbers.max();
// 9

El método min regresa el menor elemento

// [1, 0, 5, 3, 9, 3]
numbers.min();
// 0

API de Streams: colectar elementos

www.devcode.la

Colectar a una lista

// [1, 2, 5, 6, 7, 9, 10]
numbers.collect(Collectors.toList);

Colectar a un set

// [1, 0, 5, 3, 9, 3]
numbers.collect(Collectors.toSet());
numbers.collect(Collectors.toCollection(TreeSet::new));

Colectar a un mapa

 Map<Integer, String> idToName =
        people.collect(toMap(Person::getId, Person::getName));

API de Streams

www.devcode.la

Paralelización

List<String> words = readWords();
words
  .parallelStream()
  .filter(w -> w.length() > 12)
  .collect(Collectors.toList());

Conclusiones

www.devcode.la

  • Aprendimos la sintaxis y utilidad de las expresiones lambda.

  • Usamos una variedad de métodos de la API Stream.

  • Creamos ejemplos que pueden ser útiles en la construcción de sistemas más complejos.

Documentación Oracle: https://goo.gl/fHZ2K8

Curso de Java 8

By Enrique Munguía

Curso de Java 8

  • 957