זרימת Java Null-Safe מאוספים

1. סקירה כללית

במדריך זה נראה כיצד ליצור זרמים בטליים מאוספי Java.

ראשית, היכרות מסוימת עם הפניות לשיטה של ​​Java 8, Lambda Expressions, אופציונאלי ו- API של Stream נדרש כדי להבין היטב את החומר הזה.

אם אינך מכיר נושאים אלו, אנא עיין תחילה במאמרים הקודמים שלנו: תכונות חדשות ב- Java 8, מדריך ל- Java 8 אופציונלי ומבוא ל- Java 8 Streams.

2. תלות של Maven

לפני שנתחיל, יש תלות אחת של Maven שנצטרך לתרחישים מסוימים:

 org.apache.commons commons-collection4 4.2 

ה 4 ניתן להוריד את הספרייה מ Maven Central.

3. יצירת זרמים מאוספים

הגישה הבסיסית ליצירת א זרם מכל סוג של אוסף זה לקרוא ל זרם() אוֹ parallelStream () שיטות באוסף בהתאם לסוג הזרם הנדרש:

אוסף אוסף = Arrays.asList ("a", "b", "c"); זרם streamOfCollection = collection.stream (); 

ככל הנראה לאוסף שלנו יהיה מקור חיצוני בשלב כלשהו, ​​ככל הנראה נקבל שיטה דומה לזו שלמטה בעת יצירת זרמים מאוספים:

public stream collectionAsStream (אוסף אוספים) {return collection.stream (); } 

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

החלק הבא מתייחס לאופן שבו אנו יכולים להגן מפני זה.

4. הפיכת אוספים נוצרים לזרמים אפסים

4.1. הוסף צ'קים למניעה ריק הפרעות

כדי למנוע לא מכוון ריק חריגים מצביעים, אנחנו יכולים לבחור להוסיף צ'קים כדי למנוע ריק הפניות בעת יצירת זרמים מאוספים:

Stream collectionAsStream (אוסף אוספים) {return collection == null? Stream.empty (): collection.stream (); } 

עם זאת, לשיטה זו יש כמה בעיות.

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

שנית, השימוש ב ריק לייצג היעדר ערך נחשב לגישה שגויה לאחר Java SE 8: יש דרך טובה יותר לדגם את היעדרו ונוכחותו של ערך.

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

4.2. להשתמש ריקIfNull שיטה מתוך אוסף כלי עזר סִפְרִיָה

אנו יכולים לבחור להשתמש ב- Apache Commons אוסף כלי עזר הספרייה כדי לוודא שהזרם שלנו הוא ריק בטוח. ספרייה זו מספקת ריקIfNull שיטה המחזירה אוסף ריק שאינו משתנה בהתחשב ב- ריק אוסף כוויכוח, או האוסף עצמו אחרת:

אוסף זרמים ציבוריAsStream (אוסף אוספים) {החזר ריקIfNull (אוסף) .stream (); } 

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

4.3. השתמש ב- Java 8 אופציונאלי

Java SE 8 אופציונאלי הוא מיכל בעל ערך יחיד שמכיל ערך או לא. איפה שחסר ערך, ה- אופציונאלי מיכל הוא אמר ריק.

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

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

collection public streamToStream (אוסף אוספים) {return Optional.ofNullable (collection) .map (Collection :: stream) .orElseGet (Stream :: ריק); } 
  • Optional.ofNullable (אוסף) יוצר אופציונאלי אובייקט מהאוסף שהועבר. ריק אופציונאלי האובייקט נוצר אם האוסף הוא ריק.
  • מפה (אוסף :: זרם) מחלץ את הערך הכלול ב- אופציונאלי חפץ כטיעון ל מַפָּה שיטה (Collection.stream ())
  • orElseGet (זרם :: ריק) מחזירה את ערך החזרה במקרה שה- אופציונאלי האובייקט ריק, כלומר האוסף שהועבר הוא ריק.

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

4.4. השתמש ב- Java 9 זרםלא בטל

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

אנו יכולים להפוך את המדגם הנ"ל ל:

Stream collectionAsStream (אוסף אוסף) {return collection.stream (). FlatMap (s -> Stream.ofNullable (s)); }

5. מסקנה

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

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

כרגיל, קוד המקור המלא שמלווה את המאמר זמין באתר GitHub.