דילוג לתוכן המרכזי
מודול 7 · שיעור 2 מתוך 214/14 בקורס~15 min
שיעורי מודול (2/2)

Stream API

Stream API ב-Java מאפשר לך לעבד אוספים של אובייקטים בצורה הצהרתית תוך מינוף תכנות פונקציונלי. זרם אינו מאחסן נתונים, אלא נושא אלמנטים ממקור (כגון רשימה או מערך) דרך צינור פעולות.

צינור זרם מורכב משלושה חלקים:

  1. מקור (לדוגמה, list.stream())
  2. אפס או יותר פעולות ביניים (המחזירות זרם חדש, למשל, filter, map)
  3. פעולה סופית (שמייצרת תוצאה סופית או תופעת לוואי וסוגרת את הזרם, למשל, collect, forEach, reduce)

פעולות ביניים נפוצות

פעולות ביניים הן עצלות: הן אינן מבוצעות עד להפעלת פעולת מסוף.

  • filter(Predicate): מסנן אלמנטים על סמך מצב בוליאני.
  • map(Function): הופך כל אלמנט לאובייקט אחר על ידי יישום פונקציה.
  • sorted(): ממיין את הרכיבים של הזרם.
Java
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): משלב את רכיבי הזרם לערך מצטבר אחד.
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

נסה זאת בעצמך

פעילות גופנית#java.m7.l2.e1
ניסיונות: 0טוען...

השלם את הקוד באמצעות זרם המספרים כדי לסנן רק מספרים זוגיים, אסוף אותם לרשימה חדשה בשם זוגיות, והדפיס אותו באמצעות System.out.println.

טוען עורך...
הצג רמז

התחל בקריאה ל- `numbers.stream()`, הוסף `.filter(n -> n % 2 == 0)`, ולבסוף אסוף עם `.collect(Collectors.toList())`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m7.l2.e2
ניסיונות: 0טוען...

השתמש בזרמים כדי להפוך את כל השמות ברשימת השמות לאותיות רישיות באמצעות מפה, והדפיס אותם אחד אחד באמצעות forEach עם הפניה לשיטה.

טוען עורך...
הצג רמז

השתמש ב-`.map(s -> s.toUpperCase())` ולאחר מכן בפעולת הטרמינל `.forEach(System.out::println)`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m7.l2.e3
ניסיונות: 0טוען...

השלם את הקוד על ידי חישוב הסכום של כל המספרים ברשימת המספרים באמצעות Stream ופעולת הקטנת מסוף עם ערך התחלתי של 0. הדפס את הסכום.

טוען עורך...
הצג רמז

השתמש ב-`numbers.stream().reduce(0, (a, b) -> a + b)` והדפיס את המשתנה המתקבל.

הפתרון זמין לאחר 3 ניסיונות