כיצד להשיג את האלמנט האחרון של זרם בג'אווה?

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

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

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

2. באמצעות לְהַפחִית ממשק API

לְהַפחִיתבמילים פשוטות, מצמצם את קבוצת האלמנטים ב- זרם לאלמנט יחיד.

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

בואו נשתמש ב- רשימה שֶׁל חוּט ערכים, קבל את זרם מ ה רשימה ואז צמצם:

List valueList = ArrayList חדש (); valueList.add ("ג'ו"); valueList.add ("ג'ון"); valueList.add ("שון"); זרם זרם = valueList.stream (); stream.reduce ((ראשון, שני) -> שני). orElse (null); 

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

2. שימוש בפונקציה דלג

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

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

הנה הקוד לדוגמא שמקבל את האלמנט האחרון באמצעות לדלג:

List valueList = ArrayList חדש (); valueList.add ("ג'ו"); valueList.add ("ג'ון"); valueList.add ("שון"); ספירה ארוכה = valueList.stream (). count (); זרם זרם = valueList.stream (); stream.skip (count - 1) .findFirst (). get (); 

"שון" בסופו של דבר להיות האלמנט האחרון.

4. השגת האלמנט האחרון של זרם אינסופי

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

הנה הקוד לדוגמא בו לקחנו זרם אינסופי וניסינו להשיג את האלמנט האחרון:

זרם זרם = Stream.iterate (0, i -> i + 1); stream.reduce ((ראשון, שני) -> שני). orElse (null);

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

5. מסקנה

ראינו דרכים שונות להשיג את האלמנט האחרון של a זרם שניהם משתמשים לְהַפחִית ו לדלג ממשקי API. בדקנו גם למה זה לא אפשרי עם זרמים אינסופיים.

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

ניתן למצוא קטעי קוד ב- GitHub.


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