Робота з Вкладеними Структурами за Допомогою Методу 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() з вкладеними колекціями?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you show me a code example using flatMap() with nested lists?
What is the difference between map() and flatMap() in Java Streams?
Can you explain how flatMap() works step by step with a real-world scenario?
Чудово!
Completion показник покращився до 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() з вкладеними колекціями?
Дякуємо за ваш відгук!