סיכום מספרים עם זרמי ג'אווה

1. הקדמה

במדריך מהיר זה נציג דרכים שונות של חישוב סכום המספרים השלמים,באמצעות ה- Stream API.

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

2. שימוש Stream.reduce ()

Stream.reduce () היא פעולה סופנית שמבצע הפחתה על אלמנטים של הזרם.

הוא מחיל אופרטור (מצבר) בינארי על כל אלמנט בזרם, כאשר האופרנד הראשון הוא ערך ההחזרה של היישום הקודם, והשני הוא אלמנט הזרם הנוכחי.

בשיטה הראשונה של השימוש ב- לְהַפחִית() שיטה, פונקציית הצבירה היא ביטוי למבדה שמוסיף שתיים מספר שלם ערכים ומחזירים an מספר שלם ערך:

רשימת מספרים שלמים = Arrays.asList (1, 2, 3, 4, 5); סכום שלם = מספרים שלמים. Stream () .פחת (0, (a, b) -> a + b);

באותו אופן, אנו יכולים להשתמש כבר שיטת Java קיימת:

רשימת מספרים שלמים = Arrays.asList (1, 2, 3, 4, 5); סכום שלם = מספרים שלמים.זרם () .פחת (0, שלם :: סכום);

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

class class ArithmeticUtils {public static int add (int a, int b) {return a + b; }} 

לאחר מכן נוכל להעביר פונקציה זו כפרמטר ל- לְהַפחִית() שיטה:

רשימת מספרים שלמים = Arrays.asList (1, 2, 3, 4, 5); סכום שלם = מספרים שלמים.זרם () .פחת (0, ArithmeticUtils :: הוסף); 

3. שימוש Stream.collect ()

השיטה השנייה לחישוב סכום רשימת המספרים השלמים היא באמצעות ה- לאסוף() הפעלת מסוף:

רשימת מספרים שלמים = Arrays.asList (1, 2, 3, 4, 5); סכום שלם = מספרים שלמים.זרם () .collect (Collectors.summingInt (מספר שלם :: intValue));

באופן דומה, ה אספנים הכיתה מספקת summingLong () ו summingDouble () שיטות לחישוב סכומי האורכים והכפילים בהתאמה.

4. שימוש IntStream.sum ()

ממשק ה- API של Stream מספק לנו את ה- mapToInt () פעולת ביניים, הממירה את הזרם שלנו ל- IntStream לְהִתְנַגֵד.

שיטה זו לוקחת פרמטר למפות, בה היא משתמשת כדי לבצע את ההמרה, ואז נוכל לקרוא ל סְכוּם() שיטה לחישוב סכום האלמנטים של הזרם.

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

רשימת מספרים שלמים = Arrays.asList (1, 2, 3, 4, 5); סכום שלם = מספרים שלמים.זרם () .mapToInt (מספר שלם :: intValue) .sum ();

באותו אופן, אנו יכולים להשתמש ב- mapToLong () ו mapToDouble () שיטות לחישוב סכומי האורכים והכפילים בהתאמה.

5. שימוש זרם # סכום עם מַפָּה

לחישוב סכום הערכים של a מַפָּה מבנה נתונים, ראשית אנו יוצרים זרם מהערכים של זה מַפָּהואז אנו מיישמים אחת מהשיטות בהן השתמשנו בעבר.

למשל, באמצעות IntStream.sum ():

סכום שלם = map.values ​​() .stream () .mapToInt (Integer :: valueOf) .sum ();

6. שימוש זרם # סכום עם חפצים

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

לדוגמה:

פריט בכיתה ציבורית {מזהה פרטי פרטי; מחיר שלם פרטי; פריט ציבורי (מזהה int, מחיר שלם) {this.id = id; מחיר זה = מחיר; } // גטרים וקובעים סטנדרטיים} 

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

פריט פריט 1 = פריט חדש (1, 10); פריט פריט 2 = פריט חדש (2, 15); פריט פריט 3 = פריט חדש (3, 25); פריט פריט 4 = פריט חדש (4, 40); פריטי רשימה = Arrays.asList (item1, item2, item3, item4);

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

כתוצאה מכך אנו יכולים להשתמש Stream.reduce (), Stream.collect () ו- IntStream.sum () לחישוב הסכום:

סכום שלם = items.stream () .map (x -> x.getPrice ()) .reduce (0, ArithmeticUtils :: add); 
סכום שלם = items.stream () .map (x -> x.getPrice ()) .reduce (0, Integer :: sum);
סכום שלם = items.stream () .map (item -> item.getPrice ()) .reduce (0, (a, b) -> a + b);
סכום שלם = items.stream () .map (x -> x.getPrice ()) .collect (Collectors.summingInt (Integer :: intValue));
items.stream () .mapToInt (x -> x.getPrice ()) .sum ();

7. שימוש זרם # סכום עם חוּט

נניח שיש לנו חוּט אובייקט המכיל מספרים שלמים.

כדי לחשב את סכום המספרים השלמים הללו, קודם כל, אנחנו צריכים להמיר את זה חוּט לתוך מַעֲרָךאז אנחנו צריכים כדי לסנן את האלמנטים שאינם שלמים, ולבסוף, להמיר את שאר האלמנטים של המערך הזה למספרים.

בואו נראה את כל השלבים הבאים בפעולה:

מחרוזת מחרוזת = "פריט 1 10 פריט 2 25 פריט 3 30 פריט 4 45"; סכום שלם = Arrays.stream (string.split ("")) .filter ((s) -> s.matches ("\ d +")) .mapToInt (Integer :: valueOf) .sum ();

8. מסקנה

במדריך זה ראינו מספר שיטות כיצד לחשב את סכום רשימת המספרים השלמים באמצעות ה- Stream API. כמו כן, השתמשנו בשיטות אלה כדי לחשב את סכום הערכים של שדה נתון ברשימת אובייקטים, את סכום הערכים של מפה, כמו גם את המספרים בתוך נתון מסוים. חוּט לְהִתְנַגֵד.

כמו תמיד, הקוד השלם זמין ב- GitHub.