Потік flatMap() у Java з прикладами

Потік flatMap (відповідач функцій) повертає потік, що складається з результатів заміни кожного елемента цього потоку вмістом відображеного потоку, отриманого шляхом застосування наданої функції відображення до кожного елемента. Stream flatMap(Function mapper) є проміжна операція . Ці операції завжди ліниві. Проміжні операції викликаються в екземплярі Stream і після завершення обробки вони видають екземпляр Stream як вихід.

Примітка : Кожен зіставлений потік закривається після розміщення його вмісту в цьому потоці. Якщо зіставлений потік є нульовим, замість нього використовується порожній потік.

flatMap() В/с map() :
1) map() приймає потік і перетворює його на інший потік. Він застосовує функцію до кожного елемента Stream і зберігає повернуте значення в новому Stream. Це не сплющує струмок. Але flatMap() — це комбінація карти та плоскої операції, тобто вона застосовує функцію до елементів, а також зводить їх.
2) map() використовується лише для трансформації, але flatMap() використовується як для трансформації, так і для зведення.

Синтаксис:

  < R>Потік < R>flatMap(функція < ? super T, ? extends Stream < ? extends R>> Mapper), де R — тип елемента нового потоку. Потік — це інтерфейс, а T — тип елементів потоку. mapper — це функція без стану, яка застосовується до кожного елемента, і функція повертає новий потік. 

Приклад 1: функція flatMap() із наданою функцією відображення.




// Java code for Stream flatMap> // (Function mapper) to get a stream by> // replacing the stream with a mapped> // stream by applying the provided mapping function.> import> java.util.*;> import> java.util.stream.Stream;> > class> GFG {> > > // Driver code> > public> static> void> main(String[] args)> > {> > > // Creating a List of Strings> > List list = Arrays.asList(> '5.6'> ,> '7.4'> ,> '4'> ,> > '1'> ,> '2.3'> );> > > // Using Stream flatMap(Function mapper)> > list.stream().flatMap(num ->Stream.of(num)).> > forEach(System.out::println);> > }> }>

Вихід:

 5.6 7.4 4 1 2.3 

Приклад 2: Функція flatMap() із наданою операцією відображення рядка із символом у позиції 2.




// Java code for Stream flatMap> // (Function mapper) to get a stream by> // replacing the stream with a mapped> // stream by applying the provided mapping function.> import> java.util.*;> import> java.util.stream.Stream;> > class> GFG {> > > // Driver code> > public> static> void> main(String[] args)> > {> > > // Creating a List of Strings> > List list = Arrays.asList(> 'Geeks'> ,> 'GFG'> ,> > 'techcodeview.com'> ,> 'gfg'> );> > > // Using Stream flatMap(Function mapper)> > list.stream().flatMap(str ->> > Stream.of(str.charAt(> 2> ))).> > forEach(System.out::println);> > }> }>

Вихід:

 e G e g 

Як працює flatMap()?

Як уже обговорювалося в дописі, flatMap() є комбінацією карти та плоскої операції, тобто спочатку застосовує функцію карти, а потім вирівнює результат. Розглянемо кілька прикладів, щоб зрозуміти, що саме таке зведення потоку.
Приклад 1:
Список до зведення:

 [ [2, 3, 5], [7, 11, 13], [17, 19, 23] ] 

Список має 2 рівні і складається з 3 маленьких списків. Після зведення воно перетворюється на однорівневу структуру, як показано:

 [ 2, 3, 5, 7, 11, 13, 17, 19, 23 ] 

Приклад 2:
Список до зведення:

 [ ['G', 'E', 'E'], ['K', 'S', 'F'], ['O', 'R', 'G'], ['E', 'E', 'K', 'S'] ] 

Список має 3 рівні і складається з 4 маленьких списків. Після зведення воно перетворюється на однорівневу структуру, як показано:

 ['G', 'E', 'E', 'K', 'S', 'F', 'O', 'R', 'G', 'E', 'E', 'K', 'S'] 

Коротше кажучи, можна сказати, що якщо є Потік списку < < Тип даних >> перед зведенням, потім після застосування flatMap(), Потік < < Тип даних >> повертається після вирівнювання.
застосування:




// Java code for Stream flatMap(Function mapper)> import> java.util.*;> import> java.util.stream.Collectors;> > class> GFG> {> > // Driver code> > public> static> void> main(String[] args)> > {> > // Creating a list of Prime Numbers> > List PrimeNumbers = Arrays.asList(> 5> ,> 7> ,> 11> ,> 13> );> > > // Creating a list of Odd Numbers> > List OddNumbers = Arrays.asList(> 1> ,> 3> ,> 5> );> > > // Creating a list of Even Numbers> > List EvenNumbers = Arrays.asList(> 2> ,> 4> ,> 6> ,> 8> );> > > List listOfListofInts => > Arrays.asList(PrimeNumbers, OddNumbers, EvenNumbers);> > > System.out.println(> 'The Structure before flattening is : '> +> > listOfListofInts);> > > // Using flatMap for transformating and flattening.> > List listofInts = listOfListofInts.stream()> > .flatMap(list ->list.stream())>> > .collect(Collectors.toList());> > > System.out.println(> 'The Structure after flattening is : '> +> > listofInts);> > }> }>

Вихід:

 The Structure before flattening is : [[5, 7, 11, 13], [1, 3, 5], [2, 4, 6, 8]] The Structure after flattening is : [5, 7, 11, 13, 1, 3, 5, 2, 4, 6, 8]