Обидва методи 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)