זרמים מסוג פרימיטיבי ב- Java 8

1. הקדמה

ממשק ה- API של Stream היה אחת מתכונות המפתח שנוספו ב- Java 8.

בקצרה, ה- API מאפשר לנו לעבד אוספים ורצפי אלמנטים אחרים - בצורה נוחה ויעילה יותר - על ידי מתן API הצהרתי.

2. זרמים פרימיטיביים

זרמים עובדים בעיקר עם אוספים של אובייקטים ולא טיפוסים פרימיטיביים.

למרבה המזל, לספק דרך לעבוד עם שלושת הסוגים הפרימיטיביים הנפוצים ביותר - int, ארוך ו לְהַכפִּיל - הספרייה הסטנדרטית כוללת שלוש יישומים פרימיטיביים-מתמחים: IntStream, LongStream, ו DoubleStream.

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

3. פעולות חשבון

נתחיל בכמה שיטות מעניינות לביצוע פעולות חשבון נפוצות כגון דקה, מקסימום, סְכוּם, ו מְמוּצָע:

int [] מספרים שלמים = int int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (מספרים שלמים) .min () .getAsInt (); // מחזיר 7

בואו נעבור על קטע הקוד לעיל כדי להבין מה קורה.

יצרנו את שלנו IntStream על ידי שימוש ב java.util.Arrays.stream (int []) ואז השתמש ב- דקה () שיטה להשיג את המספר השלם הנמוך ביותר כ- java.util.OptionalInt ולבסוף התקשר getAsInt () להשיג את int ערך.

דרך נוספת ליצור IntStream משתמש IntStream.of (int ...). ה מקסימום () השיטה תחזיר את המספר השלם הגדול ביותר:

int max = IntStream.of (20, 98, 12, 7, 35) .max () .getAsInt (); // מחזיר 98

הבא - כדי לקבל את סכום המספרים השלמים אנחנו פשוט מכנים סְכוּם() שיטה ואנחנו לא צריכים להשתמש getAsInt () מכיוון שהוא כבר מחזיר את התוצאה כ- int ערך:

סכום int = IntStream.of (20, 98, 12, 7, 35). sum (); // מחזירה 172

אנו קוראים את מְמוּצָע() שיטה להשיג את הממוצע של ערכי מספרים שלמים וכפי שאנחנו יכולים לראות, עלינו להשתמש getAsDouble () כשהוא מחזיר ערך מסוג לְהַכפִּיל.

ממוצע כפול = IntStream.of (20, 98, 12, 7, 35). average () .getAsDouble (); // מחזיר 34.4

4. טווח

אנחנו יכולים גם ליצור IntStream מבוסס על טווח:

סכום int = IntStream.range (1, 10) .sum (); // מחזירה סכום של 45 int = IntStream.rangeClosed (1, 10) .sum (); // מחזיר 55

כפי שמוצג קטע הקוד לעיל ישנן שתי דרכים ליצור מגוון ערכים שלמים טווח() ו טווח סגור ().

ההבדל הוא שבסוף טווח() הוא בלעדי בזמן שהוא כולל ב טווח סגור ().

שיטות טווח זמינות רק עבור IntStream ו לונגסטרים.

אנו יכולים להשתמש בטווח כצורה מהודרת של לולאה לכל:

IntStream.rangeClosed (1, 5) .forEach (System.out :: println);

מה שטוב להשתמש בהם כתחליף לכל לולאה הוא שנוכל לנצל גם את הביצוע המקביל:

IntStream.rangeClosed (1, 5) .parallel () .forEach (System.out :: println);

עד כמה שהלולאות המהודרות האלה מועילות, עדיף להשתמש בלולאות המסורתיות במקום הפונקציונאליות לאיטרציות פשוטות בגלל פשטות, קריאות וביצועים במקרים מסוימים.

5. אגרוף ואי אגרוף

ישנם מקרים בהם עלינו להמיר ערכים פרימיטיביים למקבילות העטיפה שלהם.

במקרים אלה, אנו יכולים להשתמש ב- מוסגר () שיטה:

רשימת evenInts = IntStream.rangeClosed (1, 10) .filter (i -> i% 2 == 0) .boxed () .collect (Collectors.toList ());

אנו יכולים גם להמיר מזרם מחלקת העטיפה לזרם הפרימיטיבי:

// מחזיר סכום של 78 int = Arrays.asList (33,45) .stream () .mapToInt (i -> i) .sum ();

אנחנו תמיד יכולים להשתמש mapToXxx ו flatMapToXxx שיטות ליצירת זרמים פרימיטיביים.

6. מסקנה

זרמי ג'אווה הם תוספת חזקה מאוד לשפה. בקושי גירדנו את פני השטח של זרמים פרימיטיביים כאן, אך כפי שכבר ניתן להשתמש בהם כדי להיות פרודוקטיביים.

וכמו תמיד, ניתן למצוא דוגמאות קוד ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found