Continuado con los posts sobre Streams en este post explicaremos como transformar un objeto a otro utilizando la función map. Uno de los usos comunes de esto es transformar objetos a DTO’s así que tomaremos este caso como ejemplo.

Definiendo el modelo

Antes de comenzar a utilizar streams definiremos dos clases a utilizar Person y PersonDto, las cuales serán la clase base de mi aplicación y la clase a la que quiero transformar mi objeto.

Person.java

public class Person {
	private String firstName;
	private String middleName;
	private String lastName;
	private String address;

	public Person() {
	}

	public Person(String firstName, String middleName, String lastName, String address) {
		super();
		this.firstName = firstName;
		this.middleName = middleName;
		this.lastName = lastName;
		this.address = address;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getMiddleName() {
		return middleName;
	}

	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}

	public String getLastName() {
		return lastName;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

PersonDto.java

public class PersonDto {
	private String firstName;
	private String middleName;
	private String lastName;
	private String address;

	public PersonDto() {
	}

	public PersonDto(String firstName, String middleName, String lastName, String address) {
		super();
		this.firstName = firstName;
		this.middleName = middleName;
		this.lastName = lastName;
		this.address = address;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getMiddleName() {
		return middleName;
	}

	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}

	public String getLastName() {
		return lastName;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

Las dos clases anteriores servirán como base para realizar mis transformaciones.

Creando objetos de ejemplo

De el mismo modo que en el post anterior, en este post utilizaremos Java-Faker para generar datos de ejemplo más información de como utilizarlo en el siguiente enlace Java-Faker.

public static List getNames() {
	Faker faker = new Faker();
	List names = new ArrayList();
	for (int i = 0; i <= 1000; i++) {
		names.add(new Person(faker.name().firstName(), faker.name().firstName(), faker.name().lastName(),
				faker.address().fullAddress()));
	}
	return names;
}

El método anterior utiliza un Faker para generar datos de ejemplo y genera 1000 objetos Person con datos aleatorios.

Transformando objetos de la clase Person a PersonDto

Con el código anterior seremos capaces de generar 1000 objetos de tipo Person, el siguiente paso será transformarlos a objetos tipo PersonDto, veamos el siguiente ejemplo:

public static void main(String[] args) {
	List names = getNames();
	List peopleDtos = names.stream().map(person -> {
		return new PersonDto(person.getFirstName(), person.getMiddleName(), person.getLastName(),
				person.getAddress());
	}).collect(Collectors.toList());
	for (PersonDto personDto : peopleDtos) {
		System.out.println("First name: " + personDto.getFirstName());
		System.out.println("Middle name: " + personDto.getMiddleName());
		System.out.println("Last name: " + personDto.getLastName());
		System.out.println("Address: " + personDto.getAddress());
		System.out.println("--------");
	}
}

El código anterior realiza lo siguiente:

  1. Obtiene los 1000 objetos tipo Person a transformar
  2. Utilizando Streams se ejecutará lo siguiente:
    1. Crear un stream
    2. Transformar un stream de objetos de tipo Person a uno de tipo PersonDto basado en el lambda que define la transformación
    3. Transformar la respuesta a una lista
  3. Se imprimen los elementos pero ya con una lista tipo PersonDto

Salida:

--------
First name: Kenyatta
Middle name: Vallie
Last name: Runte
Address: Suite 750 049 Darrin Ford, East Minastad, NY 65986
--------
First name: Sedrick
Middle name: Cara
Last name: Willms
Address: 36767 Lueilwitz Pines, Delphineborough, NV 41658
--------
First name: Luisa
Middle name: Merritt
Last name: Weissnat
Address: 00304 Cummings Viaduct, North Elainaland, WI 84019-0601
--------
First name: Aniyah
Middle name: Deangelo
Last name: Keebler
Address: 37324 Prosacco Grove, North Shaniachester, MD 54667
--------
First name: Edwardo
Middle name: General
Last name: Fadel
Address: 54550 Grimes Forge, Trantowborough, VA 14184-7842
--------
First name: Jensen
Middle name: Edd
Last name: Rutherford
Address: 31157 McGlynn Isle, Moiseston, HI 99805
--------
1000 more...

Esto facilita la transformación de objetos de una clase a otra y es muy util al momento de escribir servicios web.

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