שיעורי מודול (2/2)
Stream API
Stream API ב-Java מאפשר לך לעבד אוספים של אובייקטים בצורה הצהרתית תוך מינוף תכנות פונקציונלי. זרם אינו מאחסן נתונים, אלא נושא אלמנטים ממקור (כגון רשימה או מערך) דרך צינור פעולות.
צינור זרם מורכב משלושה חלקים:
- מקור (לדוגמה,
list.stream()) - אפס או יותר פעולות ביניים (המחזירות זרם חדש, למשל,
filter,map) - פעולה סופית (שמייצרת תוצאה סופית או תופעת לוואי וסוגרת את הזרם, למשל,
collect,forEach,reduce)
פעולות ביניים נפוצות
פעולות ביניים הן עצלות: הן אינן מבוצעות עד להפעלת פעולת מסוף.
filter(Predicate): מסנן אלמנטים על סמך מצב בוליאני.map(Function): הופך כל אלמנט לאובייקט אחר על ידי יישום פונקציה.sorted(): ממיין את הרכיבים של הזרם.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"פעולות מסוף נפוצות
forEach(Consumer): מבצע פעולה עבור כל רכיב בזרם.collect(Collector): אוסף את תוצאות הזרם לתוך מיכל (לדוגמה, רשימה באמצעותCollectors.toList()).reduce(identity, BinaryOperator): משלב את רכיבי הזרם לערך מצטבר אחד.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10נסה זאת בעצמך
השלם את הקוד באמצעות זרם המספרים כדי לסנן רק מספרים זוגיים, אסוף אותם לרשימה חדשה בשם זוגיות, והדפיס אותו באמצעות System.out.println.
הצג רמז
התחל בקריאה ל- `numbers.stream()`, הוסף `.filter(n -> n % 2 == 0)`, ולבסוף אסוף עם `.collect(Collectors.toList())`.
הפתרון זמין לאחר 3 ניסיונות
השתמש בזרמים כדי להפוך את כל השמות ברשימת השמות לאותיות רישיות באמצעות מפה, והדפיס אותם אחד אחד באמצעות forEach עם הפניה לשיטה.
הצג רמז
השתמש ב-`.map(s -> s.toUpperCase())` ולאחר מכן בפעולת הטרמינל `.forEach(System.out::println)`.
הפתרון זמין לאחר 3 ניסיונות
השלם את הקוד על ידי חישוב הסכום של כל המספרים ברשימת המספרים באמצעות Stream ופעולת הקטנת מסוף עם ערך התחלתי של 0. הדפס את הסכום.
הצג רמז
השתמש ב-`numbers.stream().reduce(0, (a, b) -> a + b)` והדפיס את המשתנה המתקבל.
הפתרון זמין לאחר 3 ניסיונות