Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Робота з Вкладеними Структурами за Допомогою Методу flatMap() | Секція
Practice
Projects
Quizzes & Challenges
Вікторини
Challenges
/
Stream API в Java

bookРобота з Вкладеними Структурами за Допомогою Методу 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

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package 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()). Це об’єднує всі списки продуктів в єдиний безперервний потік значень.

Далі, map(String::toUpperCase) застосовує toUpperCase() до кожної назви продукту, забезпечуючи, що всі назви будуть у верхньому регістрі перед збором їх у productList за допомогою toList().

Об’єднання колекцій в одну

Коли дані організовані у вигляді вкладених колекцій, метод flatMap() допомагає об’єднати їх в єдиний потік, що спрощує подальшу обробку. Наприклад, можна об’єднати масив, який містить інші масиви, в один масив.

Приклад

Є кілька виробничих ліній, кожна з яких виготовляє декілька продуктів. Мета — отримати єдиний список усіх продуктів, вироблених на цих лініях.

Main.java

Main.java

copy
12345678910111213141516171819202122
package 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() з вкладеними колекціями?

question mark

Що робить метод flatMap() у Stream API?

Select the correct answer

question mark

Що відбувається при використанні flatMap() з вкладеними колекціями?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 19

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 1. Розділ 19
some-alt