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

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

Далі, 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

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

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

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

Секція 2. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Awesome!

Completion rate improved to 2.33

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

Далі, 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

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

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

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

Секція 2. Розділ 4
some-alt