ה זרם API הוצג ב Java 8 המשמש לעיבוד אוספי החפצים. ניתן להשתמש בו על ידי ייבוא של java.util.stream חֲבִילָה. בחלק זה, נדון ב Stream.flatMap() שיטת ה-API של Stream. כמו כן, נדון ב ההבדלים העיקריים בין שיטת Stream.flatMap() ו- Stream.map() ב-Java 8.
הסרה מרשימת המערכים
לפני שנעבור לנושא, ראשית, נבין את Stream.map() שיטה. בגלל ה flatMap() השיטה מבוססת על מַפָּה() שיטה.
שיטת Java Stream.map()
ה Stream.map() השיטה מבצעת פעולת ביניים באמצעות פונקציית המפה. זה מייצר זרם חדש עבור כל אלמנט. זה הופך את כל הזרמים לזרם יחיד כדי לספק את התוצאה. לכן, כל רכיב בזרם הופך לזרם חדש.
תחביר:
Stream map(Function mapper)
R: זהו פרמטר סוג המייצג את סוג האלמנט של הזרם החדש.
ממפה: זהו פרמטר שאינו מפריע, פונקציה חסרת מצב להחיל על כל אלמנט.
דוגמה לשיטת map()
List citylist = Arrays.asList('delhi', 'mumbai', 'hyderabad', 'ahmedabad', 'indore', 'patna'). stream(). map(String::toUpperCase).collect(Collectors.toList());
שקול את ההצהרה לעיל עבור מפה של זרם . זה יוצר זרם שנוצר באמצעות map(). בכל איטרציה, map() יוצר זרם נפרד עם התוצאה על ידי ביצוע פונקציית המאפר. לבסוף, map() הופך את כל הזרמים לזרם יחיד.
MapExample.java
import java.util.*; public class MapExample { public static void main(String args[]) { System.out.println('Stream After applying the map() function: '); //creats a list of integers List list = Arrays.asList(12, 45, 67, 19, 87, 2, 9); //creating a new stream of the elements an prints the same using the foreach loop list.stream().map(number -> number * 2).forEach(System.out::println); } }
תְפוּקָה:
Stream After applying the map() function: 24 90 134 38 174 4 18
שיטת Java Stream.flatMap()
ב Java 8 Streams, שיטת flatMap() מיישמת פעולה כפונקציית ממפה ומספקת זרם של ערכי אלמנט. זה אומר שבכל איטרציה של כל אלמנט שיטת map() יוצרת זרם חדש נפרד. על ידי שימוש במנגנון ההשטחה, הוא ממזג את כל הזרמים לזרם אחד שנוצר. בקיצור, הוא משמש להמרת Stream of Stream לרשימת ערכים.
תחביר:
Stream flatMap(Function<? super T,? extends Stream> mapper)
השיטה לוקחת פונקציה כארגומנט. הוא מקבל T כפרמטר ומחזיר זרם של R.
R: זהו פרמטר סוג המייצג את סוג האלמנט של הזרם החדש.
ממפה: זהו פרמטר שהוא פונקציה לא מפריעה וחסרת מצב שיש להחיל על כל אלמנט. זה מייצר זרם של ערכים חדשים.
בקיצור, אנחנו יכולים לומר ששיטת flatMap() עוזרת בהמרה זרם
flatMap() = Flattening (flat)+ mapping (map)
בואו נבין את המשמעות של רידוד.
מה זה השטחה?
רִדוּד הוא תהליך של המרת מספר רשימות של רשימות ומיזוג כל הרשימות הללו ליצירת רשימה אחת המכילה את כל האלמנטים מכל הרשימות.
int ל-char
דוגמה להשטחה
שקול את רשימות הרשימות הבאות:
לפני הרידוד: [[1, 2, 3, 4], [7, 8, 9, 0], [5, 6], [12, 18, 19, 20, 17], [22]]
לאחר הרידוד: [1, 2, 3, 4, 7, 8, 9, 0, 5, 6, 12, 18, 19, 20, 17, 22]
נט לעומת מיטה
דוגמה לשיטת flatMap()
List country = Stream.of(Arrays.asList('Colombia', 'Finland', 'Greece', 'Iceland', 'Liberia', 'Mali', 'Mauritius'), Arrays.asList('Peru', 'Serbia', 'Singapore', 'Turkey', 'Uzbekistan', 'Yemen', 'Zimbabwe', 'Greece', 'Iceland')).flatMap(List::stream) .collect(Collectors.toList());
אנו יכולים להשתמש בשיטת flatMap() בזרם עם פונקציית המפה List::stream. בביצוע פעולת מסוף הזרם, כל רכיב של flatMap() מספק זרם נפרד. בשלב האחרון, שיטת flatMap() הופכת את כל הזרמים לזרם חדש. בזרם לעיל, אנו רואים שהוא אינו מכיל ערכים כפולים.
בואו ניצור תוכנית Java ונשתמש בשיטת flatMap() .
FlatMapExample.java
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FlatmapExample { public static void main(String args[]) { //creating ArrayList List productlist1 = Arrays.asList('Printer', 'Mouse', 'Keyboard', 'Motherboard'); List productlist2 = Arrays.asList('Scanner', 'Projector', 'Light Pen'); List productlist3 = Arrays.asList('Pen Drive', 'Charger', 'WIFI Adapter', 'Cooling Fan'); List productlist4 = Arrays.asList('CPU Cabinet', 'WebCam', 'USB Light', 'Microphone', 'Power cable'); List<list> allproducts = new ArrayList<list>(); //adding elements to the list allproducts.add(productlist1); allproducts.add(productlist2); allproducts.add(productlist3); allproducts.add(productlist4); //creating a list of all products List listOfAllProducts = new ArrayList(); //for each loop iterates over the list for(List pro : allproducts) { for(String product : pro) { //adds all products to the list listOfAllProducts.add(product); } } System.out.println('List Before Applying mapping and Flattening: '); //prints stream before applying the flatMap() method System.out.println(listOfAllProducts); System.out.println(); //creats a stream of elemnts using flatMap() List flatMapList = allproducts .stream().flatMap(pList -> pList.stream()).collect(Collectors.toList()); System.out.println('List After Applying Mapping and Flattening Operation: '); //prints the new stream that we get after applying mapping and flattening System.out.println(flatMapList); } } </list></list>
תְפוּקָה:
List Before Applying mapping and Flattening: [Printer, Mouse, Keyboard, Motherboard, Scanner, Projector, Lighten, Pen Drive, Charger, WIFI Adapter, Cooling Fan, CPU Cabinet, WebCam, USB Light, Microphone] List After Applying Mapping and Flattening Operation: [Printer, Mouse, Keyboard, Motherboard, Scanner, Projector, Light Pen, Pen Drive, Charger, WIFI Adapter, Cooling Fan, CPU Cabinet, WebCam, USB Light, Microphone]
כעת, הבנו את שתי השיטות של מחלקת Stream. מכיוון שאנו יכולים להצביע בקלות על ההבדלים העיקריים ביניהם.
Stream.flatMap() לעומת Stream.map()
הטבלה הבאה מתארת את ההבדלים העיקריים בין Stream.flatMap() ל-Stream.map().
Stream.flatMap() | Stream.map() |
---|---|
הוא מעבד את זרם הערכים של הזרם. | הוא מעבד את זרם הערכים. |
הוא מבצע מיפוי יחד עם רידוד. | הוא מבצע מיפוי בלבד. |
זה הופך נתונים מ-Stream | זה הופך נתונים מזרם לזרם. |
הוא משתמש במיפוי One-To-Many. | הוא משתמש במיפוי אחד לאחד. |
פונקציית המפה שלו מייצרת מספר ערכים (זרם ערכים) עבור כל ערך קלט. | פונקציית המפה שלה מייצרת ערכים בודדים עבור כל ערך קלט. |
השתמש בשיטת flatMap() כאשר פונקציית המפה מייצרת מספר ערכים עבור כל ערך קלט. | השתמש בשיטת map() כאשר פונקציית המפה מייצרת ערכים בודדים עבור כל ערך קלט. |