האם עלינו לסגור זרם ג'אווה?

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

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

במדריך מהיר זה נלמד האם עלינו לסגור במפורש את זרמי Java 8 על ידי התבוננות בהם מנקודת מבט של משאבים.

2. סגירת זרמים

זרמי Java 8 מיישמים את ניתן לסגירה אוטומטית מִמְשָׁק:

ממשק ציבורי זרם מרחיב את BaseStream {// הושמט} ממשק ציבורי BaseStream מרחיב סגירה אוטומטית {// הושמט}

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

זה אולי נשמע נגד אינטואיטיבי בהתחלה, אז בואו נראה מתי עלינו ומתי לא כדאי לסגור זרמי Java 8.

2.1. אוספים, מערכים וגנרטורים

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

צבעי רשימה = List.of ("אדום", "כחול", "ירוק") .stream () .filter (c -> c.length ()> 4) .map (String :: toUpperCase) .collect (Collectors. למנות());

לפעמים אנו יוצרים זרם רציף סופי או אינסופי:

אקראי אקראי = אקראי חדש (); random.ints (). takeWhile (i -> i <1000) .forEach (System.out :: println);

בנוסף, אנו יכולים גם להשתמש בזרמים מבוססי מערך:

מחרוזת [] צבעים = {"אדום", "כחול", "ירוק"}; Arrays.stream (צבעים) .map (מחרוזת :: toUpperCase) .toArray ()

כאשר אנו עוסקים בסוגים אלה של זרמים, אסור לנו לסגור אותם במפורש. המשאב היקר היחיד הקשור לזרמים אלה הוא זיכרון, ו- Garbage Collection (GC) דואג לכך באופן אוטומטי.

2.2. משאבי IO

עם זאת, חלק מהזרמים מגובים במשאבי IO כגון קבצים או שקעים. לדוגמא, ה Files.lines () השיטה מזרימה את כל השורות עבור הקובץ הנתון:

Files.lines (Paths.get ("/ path / to / file")) .flatMap (line -> Arrays.stream (line.split (","))) // הושמט

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

כדי למנוע דליפות משאבים כאלה, מומלץ מאוד להשתמש ב- נסה עם משאבים שפה לסגירת זרמים מבוססי IO:

נסה (זרם שורות = Files.lines (Paths.get ("/ path / to / file"))) {lines.flatMap (line -> Arrays.stream (line.split (","))) // הושמט}

בדרך זו המהדר יסגור את הערוץ באופן אוטומטי. המפתח העיקרי כאן הוא סגירת כל הזרמים מבוססי ה- IO.

שים לב שסגירת זרם סגור כבר תזרוק IllegalStateException.

3. מסקנה

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

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


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