map() та flatMap()

Обидва методи map і flatMap є часто використовуваними операціями в Java Stream API, які перетворюють дані різними способами. Вони використовуються для перетворення або трансформації елементів потоку.

1. map

Метод map використовується для трансформації кожного елемента потоку в іншу форму. Він застосовує функцію до кожного елемента потоку і повертає новий потік, що складається з перетворених елементів.

Підпис:

 Stream map(Function mapper);

Як це працює:

  • map застосовує вказану функцію до кожного елемента і створює новий потік, де кожен елемент є результатом застосування цієї функції.
  • Він не виконує згладжування будь-якої структури даних; просто трансформує кожен елемент у інший елемент.

2. flatMap

Метод flatMap використовується для трансформації кожного елемента в потік елементів і потім згладжування отриманих потіків в один потік. Це зазвичай використовується, коли кожен елемент у вихідному потоці може створювати кілька елементів у новому потоці.

Підпис:

 Stream flatMap(Function> mapper);

Як це працює:

  • flatMap особливо корисний, коли потрібно згладити потік колекцій або будь-яку структуру, де кожен елемент може бути потоком значень.
  • Він застосовує вказану функцію до кожного елемента потоку, яка повинна повертати потік, а потім згладжує ці потоки в один потік.

Підсумок відмінностей:

map() бере потік і перетворює його в новий потік.

функція трансформації застосовується до кожного значення в потоці

використовується для однозначного перетворення

flatMap() використовується для трансформації і згладжування.
зазвичай використовується з вкладеними об'єктами/списками.

бере потік потіків як вхід і виводить новий потік

використовується для відображення "один до багатьох"

Код для практики:

import java.io.*;  
import java.util.*;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.stream.Collectors;  

class Main {  

 static class Address {  
 private String country;  
 private String city;  

 public Address(String country, String city) {  
 this.country = country;  
 this.city = city;  
 }  

 public String getCountry() {  
 return country;  
 }  

 public void setCountry(String country) {  
 this.country = country;  
 }  

 public String getCity() {  
 return city;  
 }  

 public void setCity(String city) {  
 this.city = city;  
 }  

 @Override  
 public String toString() {  
 return "Country: " + country + ", City: " + city;  
 }  
 }  

 static class Employee {  
 String name;  
 String email;  
 Address address;  
 List phoneNumbers;  

 public Employee(String name, String email, Address address, List phoneNumbers) {  
 this.name = name;  
 this.email = email;  
 this.address = address;  
 this.phoneNumbers = phoneNumbers;  
 }  

 @Override  
 public String toString() {  
 return "Name: " + name + ", Email: " + email + ", Address: [" + address + "], Phone Numbers: " + phoneNumbers;  
 }  

 public String getName() {  
 return name;  
 }  

 public String getEmail() {  
 return email;  
 }  

 public Address getAddress() {  
 return address;  
 }  

 public List getPhoneNumbers() {  
 return phoneNumbers;  
 }  
 }  

 public static void main(String[] args) {  

 Address address1 = new Address("India", "Delhi");  
 List phoneNumbers1 = Arrays.asList("689746464", "983646646");  
 Employee emp1 = new Employee("joe", "[email protected]", address1, phoneNumbers1);  

 Address address2 = new Address("USA", "New York");  
 List phoneNumbers2 = Arrays.asList("1234567890");  
 Employee emp2 = new Employee("John", "[email protected]", address2, phoneNumbers2);  

 Address address3 = new Address("UK", "London");  
 List phoneNumbers3 = Arrays.asList("1122334455", "6677889900","74768886845","837589275875");  
 Employee emp3 = new Employee("Alice", "[email protected]", address3, phoneNumbers3);  

 Address address4 = new Address("Canada", "Toronto");  
 List phoneNumbers4 = Arrays.asList("9988776655", "5566778899");  
 Employee emp4 = new Employee("Bob", "[email protected]", address4, phoneNumbers4);  

 Address address5 = new Address("Canada", "London");  
 List phoneNumbers5 = Arrays.asList("4988776655", "5266778899");  
 Employee emp5 = new Employee("Casey", "[email protected]", address5, phoneNumbers5);  

 List employees = new ArrayList<>();  
 employees.add(emp1);  
 employees.add(emp2);  
 employees.add(emp3);  
 employees.add(emp4);  
 employees.add(emp5);  

 // 1. Використовуємо map для отримання імен усіх співробітників і виведення їх у вигляді списку.  
 List names = employees.stream().map(emp -> emp.getName()).collect(Collectors.toList());  
 System.out.println(names);  

 // 2. Використовуємо flatMap для отримання єдиного списку всіх номерів телефонів усіх співробітників.  
 List phonenumbers = employees.stream().flatMap(emp -> emp.getPhoneNumbers().stream()).collect(Collectors.toList());  
 System.out.println(phonenumbers);  

 // 3. Використовуємо map для трансформації електронних адрес усіх співробітників в верхній регістр і виведення їх.  
 List emailUppercase = employees.stream().map(emp -> emp.getEmail().toUpperCase()).collect(Collectors.toList());  
 System.out.println(emailUppercase);  

 // 4. Використовуємо map для трансформації адреси кожного співробітника у рядок формату "Місто, Країна".  
 var address = employees.stream().map(emp -> emp.getAddress().getCity() + ", " + emp.getAddress().getCountry()).collect(Collectors.toList());  
 System.out.println(address);  

 // 5.
Використовуємо flatMap для отримання всіх міст, де знаходяться співробітники, і виведення унікального списку міст (без дублювань).  
 var uniquecities = employees.stream().map(emp -> emp.getAddress().getCity()).collect(Collectors.toSet());  
 System.out.println(uniquecities);  

 // 6. Використовуємо flatMap для витягнення номерів телефонів співробітників, які живуть у "Лондоні", і виведення їх.  
 var phLondon = employees.stream()  
 .filter(emp -> emp.getAddress().getCity().equals("London"))  
 .flatMap(emp -> emp.getPhoneNumbers().stream())  
 .collect(Collectors.toList());  
 System.out.println(phLondon);  
 }  
}




Перекладено з: [map() and flatMap()](https://medium.com/@1998sagrika/map-and-flatmap-9849f9d40623)

Leave a Reply

Your email address will not be published. Required fields are marked *