Java 8 Streams – Principios básicos


En este post será el primero de un conjunto de posts donde hablaremos sobre el api de Streams que se agregó en Java 8, a continuación presentaremos los conceptos básicos.

Stream

Un Stream es una abstracción que se enfoca en conjuntos y no en piezas individuales de código permitiendo realizar programación funcional en lugar de hacer programación imperativa. A continuación analizaremos un problema básico y veremos su solución utilizando programación imperativa y como se resolvería a través del uso de Streams.

Analizando el problema

A continuación evaluaremos un problemas y veremos sus soluciones utilizando programación imperativa y después su solución utilizando streams. Esto permitirá entender claramente los beneficios de la misma.

Person.java


public class Person {
	private String name;
	private String lastName;
	private Integer age;

	public Person() {

	}

	public Person(String name, String lastName, Integer age) {
		super();
		this.name = name;
		this.lastName = lastName;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", lastName=" + lastName + ", age=" + age + "]";
	}

}

Como se puede ver esta es un POJO tradicional solo con los atributos nombre, apellido y edad, nada relacionado con streams.

Problema a resolver

Obtener a las 5 primeras personas que tengan menos de 18 años.

Solución imperativa

public void imperativeSolution() {
	List people = getPeople();
	List minor = new ArrayList();
	int counter = 0;
	for (Person person : people) {
		if (person.getAge() < = 18) {
			minor.add(person);
			counter++;
			if (counter == 5) {
				break;
			}
		}
	}
	System.out.println(minor);
}

Asumamos que existe un método llamado getPeople() que devuelve una lista de objetos de tipo Person, en el código anterior podemos ver que es necesario crear dos listas, definir un contador, iterar sobre la lista de personas, validar la edad, incrementar el counter, validar si ya tenemos 5 personas e imprimir el resultado.

Solución utilizando streams

public void streamsSolution() {
	List people = getPeople();
	List minor = people.stream().filter(person -> person.getAge() <= 18).limit(5)
			.collect(Collectors.toList());
	System.out.println(minor);
}

Antes de analizar el código a simple vista notamos que es mucho más sencillo, como podemos ver todo lo que hicimos en el método anterior se puede hacer en 3 líneas de código con lo siguiente llamamos al método getPeople(), filtramos a las personas con edad menor a 18 años, limitamos la respuesta a 5 valores, lo devolvemos como colección y lo imprimimos.

¿Cómo utilizar Streams?

Para utilizar streams debes seguir los siguientes pasos:

  1. Iniciar con una implementación concreta
    1. Arrays
    2. Set
    3. List
    4. Map
    5. etc
  2. Llamar al método stream() de la implementación, esto devolverá un stream el cual podrás utilizar en tu aplicación, recuerda que es posible concatenar multiples streams. A un conjunto de streams los llamaremos una abstracción.Captura de pantalla 2018-05-17 a las 11.40.43 a.m.
  3. Contaremos con las siguientes operaciones dentro de los streams:
    1. Filter
    2. Map
    3. Reduce
  4. El siguiente paso será ir del stream al caso concreto de nuevo, esto significa volver al Int, List, Object, Optional, etc. Algunas de las operaciones que podemos llevar a cabo para hacerlo son las siguientes:
    1. sum()
    2. collect(Collectors.toList())
    3. average()
    4. collect(Collectors.groupingBy())
    5. etc

Esto solo es el primer post sobre streams, en futuros posts hablaremos sobre todas las operaciones que puedes llevar a cabo haciendo uso de streams, para enterarte sobre futuros posts te recomendamos seguirnos en nuestras redes sociales: https://twitter.com/geeks_mx y https://www.facebook.com/geeksJavaMexico/.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s