Робота з Вкладеними Структурами за Допомогою Методу flatMap()
Під час роботи з колекціями даних у Java часто виникають ситуації, коли наші структури є вкладеними. Наприклад, може бути список об'єктів, кожен з яких містить ще один список об'єктів.
У таких випадках стандартні операції, як-от map(), не підходять для отримання всіх вкладених даних в одному потоці. Саме тут стає у пригоді метод flatMap() з Stream API.
Метод flatMap() приймає функцію, яка перетворює кожен елемент потоку на новий потік.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— тип елементів у підсумковому потоці;Function<? super T, ? extends Stream<? extends R>> mapper— функція, яка приймає елемент з початкового потоку (T) і повертає потік (Stream<R>) підсумкових елементів.
Важливо розуміти, що flatMap() не просто повертає новий елемент, а саме потік (або іншу колекцію) для кожного елемента. Ці окремі потоки потім об'єднуються в один.
Практичне застосування
Уявіть, що у вас є декілька фабрик, кожна з яких виробляє різні типи продукції. Наша мета — створити єдиний список усіх продуктів з цих фабрик і перетворити їхні назви на великі літери.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }
Список factories містить декілька об'єктів Factory, кожен з яких має name та список products. Оскільки getProducts() повертає список, виклик stream() для factories зазвичай дає потік об'єктів Factory, що не є потрібним результатом.
Щоб отримати фактичні назви продуктів, використовується flatMap(factory -> factory.getProducts().stream()). Це об'єднує всі списки продуктів в один суцільний потік значень типу String.
Далі, map(String::toUpperCase) застосовує метод toUpperCase() до кожної назви продукту, забезпечуючи, що всі назви будуть у верхньому регістрі перед збором їх у productList за допомогою toList().
Об'єднання колекцій в одну
Коли дані організовані як вкладені колекції, метод flatMap() допомагає об'єднати їх в один потік, що спрощує подальшу обробку. Наприклад, можна об'єднати масив, який містить інші масиви, в один масив.
Приклад
Є декілька виробничих ліній, кожна з яких виготовляє кілька продуктів. Мета — отримати єдиний список усіх продуктів, виготовлених на цих лініях.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }
Цей код використовує flatMap() для об'єднання вкладених списків продуктів з різних виробничих ліній в єдиний потік.
Кожна виробнича лінія, представлена як список продуктів, перетворюється на потік елементів, який потім збирається у підсумковий список за допомогою toList(). У результаті формується єдиний список, що містить усі продукти, виготовлені на фабриці.
1. Що робить метод flatMap() у Stream API?
2. Що відбувається при використанні flatMap() з вкладеними колекціями?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 2.33
Робота з Вкладеними Структурами за Допомогою Методу flatMap()
Свайпніть щоб показати меню
Під час роботи з колекціями даних у Java часто виникають ситуації, коли наші структури є вкладеними. Наприклад, може бути список об'єктів, кожен з яких містить ще один список об'єктів.
У таких випадках стандартні операції, як-от map(), не підходять для отримання всіх вкладених даних в одному потоці. Саме тут стає у пригоді метод flatMap() з Stream API.
Метод flatMap() приймає функцію, яка перетворює кожен елемент потоку на новий потік.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— тип елементів у підсумковому потоці;Function<? super T, ? extends Stream<? extends R>> mapper— функція, яка приймає елемент з початкового потоку (T) і повертає потік (Stream<R>) підсумкових елементів.
Важливо розуміти, що flatMap() не просто повертає новий елемент, а саме потік (або іншу колекцію) для кожного елемента. Ці окремі потоки потім об'єднуються в один.
Практичне застосування
Уявіть, що у вас є декілька фабрик, кожна з яких виробляє різні типи продукції. Наша мета — створити єдиний список усіх продуктів з цих фабрик і перетворити їхні назви на великі літери.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }
Список factories містить декілька об'єктів Factory, кожен з яких має name та список products. Оскільки getProducts() повертає список, виклик stream() для factories зазвичай дає потік об'єктів Factory, що не є потрібним результатом.
Щоб отримати фактичні назви продуктів, використовується flatMap(factory -> factory.getProducts().stream()). Це об'єднує всі списки продуктів в один суцільний потік значень типу String.
Далі, map(String::toUpperCase) застосовує метод toUpperCase() до кожної назви продукту, забезпечуючи, що всі назви будуть у верхньому регістрі перед збором їх у productList за допомогою toList().
Об'єднання колекцій в одну
Коли дані організовані як вкладені колекції, метод flatMap() допомагає об'єднати їх в один потік, що спрощує подальшу обробку. Наприклад, можна об'єднати масив, який містить інші масиви, в один масив.
Приклад
Є декілька виробничих ліній, кожна з яких виготовляє кілька продуктів. Мета — отримати єдиний список усіх продуктів, виготовлених на цих лініях.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }
Цей код використовує flatMap() для об'єднання вкладених списків продуктів з різних виробничих ліній в єдиний потік.
Кожна виробнича лінія, представлена як список продуктів, перетворюється на потік елементів, який потім збирається у підсумковий список за допомогою toList(). У результаті формується єдиний список, що містить усі продукти, виготовлені на фабриці.
1. Що робить метод flatMap() у Stream API?
2. Що відбувається при використанні flatMap() з вкладеними колекціями?
Дякуємо за ваш відгук!