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:
- Obtiene los 1000 objetos tipo Person a transformar
- Utilizando Streams se ejecutará lo siguiente:
- Crear un stream
- Transformar un stream de objetos de tipo Person a uno de tipo PersonDto basado en el lambda que define la transformación
- Transformar la respuesta a una lista
- 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