1. map()
- Used to transform each element of a stream.
- Each element is mapped to exactly one output element.
2. flatMap()
- It “flattens” the nested structures into a single stream.
- Useful when dealing with lists of lists, or streams of streams.
Great example! Let’s use an Employee class where:
- Each employee has a single ID → (map()is suitable).
- Each employee has multiple phone numbers → (flatMap()is required to flatten them).
Example: Using map() and flatMap() with Employee Data
package com.eazybytes.mapflatmap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class MapFlatMapExample {
    public static void main(String[] args) {
        List<Employee> employeeList = new ArrayList<>();
        employeeList.add(new Employee(Arrays.asList("1234567890", "9876543210"), 50000, "Developer", "Nisha Patel", 1));
        employeeList.add(new Employee(Arrays.asList("1234567891", "9876543211"), 55000, "Designer", "Arjun Rao", 2));
        employeeList.add(new Employee(Arrays.asList("1234567892", "9876543212"), 60000, "Manager", "Rahul Sharma", 3));
        employeeList.add(new Employee(Arrays.asList("1234567893", "9876543213"), 52000, "Analyst", "Priyanka Chopra", 4));
        employeeList.add(new Employee(Arrays.asList("1234567894", "9876543214"), 48000, "Tester", "Rohan Khanna", 5));
        List<Integer> employeeIdList = employeeList.stream().map(employee -> employee.getEid()).collect(Collectors.toList());
        System.out.println(employeeIdList);
        List<List<String>> employeePhoneList1 = employeeList.stream().map(employee -> employee.getPhoneNumbers()).collect(Collectors.toList());
        System.out.println("Issue: " + employeePhoneList1);
        List<String> employeePhoneList2 = employeeList.stream().flatMap(employee -> employee.getPhoneNumbers().stream()).collect(Collectors.toList());
        System.out.println("Solution: " + employeePhoneList2);
    }
}
Map output: [1, 2, 3, 4, 5]
Issue with map : [[1234567890, 9876543210], [1234567891, 9876543211], [1234567892, 9876543212], [1234567893, 9876543213], [1234567894, 9876543214]]
Solution: [1234567890, 9876543210, 1234567891, 9876543211, 1234567892, 9876543212, 1234567893, 9876543213, 1234567894, 9876543214]
📌 Understanding map() vs. flatMap()
| Operation |  | 
|---|
| Extract Employee IDs map() | ✅ Each Employee has one ID, so map()is used | 
| Extract Employee Phone Numbers flat Map() | ✅ Each Employee has multiple phone numbers, so flatMap()is used to merge them | 
📝 Summary
- map(Employee::getId): Each Employee has one ID → Produces a list of IDs.
- flatMap(emp -> emp.getPhoneNumbers().stream()): Each Employee has multiple phone numbers, so we flatten them into a single list.
Key Differences
| Feature | map() | flatMap() | 
|---|
| Output Structure | One-to-one mapping | One-to-many mapping (flattens) | 
| Returns | Stream<T> | Stream<R>(flattened) | 
| Handles Nested Streams | No, results in Stream<Stream<T>> | Yes, converts Stream<Stream<T>>toStream<T> |