זרמי Java 8 מאפשרים למפתחים לחלץ נתונים מדויקים מאוסף גדול, באמצעות קבוצה של פעולות שהוגדרו מראש.
לפני שחרורו של Java 8, השימוש במונח "זרם" ב- Java ישויך אוטומטית ל- I / O. עם זאת, ג'אווה 8 הציגה זרם שאפשר לכנותו מכלול שלבים חישוביים המשורשרים יחד במה שמכונה בדרך כלל "צינור זרם".
מאמר זה יציג בפניכם את זרמי Java 8 וידגים כיצד הם יכולים להיות שימושיים בפרויקטים שלכם.
מה זה זרם?
זרם הוא ממשק Java שלוקח מקור, מבצע מערך פעולות לחילוץ נתונים ספציפיים ואז מספק את הנתונים ליישום לשימוש. בעיקרו של דבר, הוא מאפשר לך לחלץ נתונים מיוחדים מאוסף נתונים כללים.
איך עובדים זרמים
צינור זרם מתחיל תמיד עם מקור. סוג המקור תלוי בסוג הנתונים איתם אתה מתמודד, אך שניים מהפופולריים יותר הם מערכים ואוספים.
כדי להפוך את האוסף לזרם ראשוני, תצטרך להוסיף את ה- זרם() פונקציה למקור. זה יכניס את המקור לצינור הזרם שבו מספר פעולות ביניים שונות (כגון לְסַנֵן() ו סוג()) יכול לפעול על זה.
לאחר ביצוע כל פעולות הביניים הנדרשות, תוכלו להפעיל פעולת מסוף (כגון לכל אחד()), אשר יפיקו את הנתונים שחולצו בעבר מהמקור.
חיים ללא זרמים
Java 8 שוחרר בשנת 2014, אך לפני כן, מפתחי Java עדיין היו צריכים לחלץ נתונים מיוחדים מתוך אוסף של נתונים כלליים.
נניח שיש לך רשימה של תווים אקראיים המשולבים עם מספרים אקראיים ליצירת ערכי מחרוזות ייחודיים, אבל אתה רק רוצה את הערכים שמתחילים בתו "C" ואתה רוצה לסדר את התוצאה בעלייה להזמין. כך היית מחלץ את הנתונים ללא זרמים.
קָשׁוּר: מה שאתה צריך לדעת על שימוש במיתרים ב- Java
דוגמה לסינון ומיון ערכים ללא זרמים
ייבא java.util. רשימת מערך;
ייבא java.util. מערכים;
ייבא java.util. רשימה;
מעמד ציבורי ראשי {
ראשי סטטי ציבורי ריק (מחרוזת [] טוען) {
// להכריז ולאתחל את רשימת המערכים
רשימה randomValues = Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// הכריזו שרשימת המערכים תשמור את הערכים הדרושים
רשימה requiredValues = ArrayList חדש <> ();
// חילוץ הערכים הנדרשים ושמירתם ב- reqquiredValues
randomValues.forEach (ערך -> {
אם (value.startsWith ("C")) {
requiredValues.add (value);
}
});
// למיין את הערכים הנדרשים בסדר עולה
requiredValues.sort ((ערך מחרוזת 1, ערך מחרוזת 2) -> ערך1.לשוואה (ערך 2));
// הדפיסו כל ערך למסוף
requiredValues.forEach ((ערך מחרוזת) -> System.out.println (ערך));
}
}
יהיה עליך גם להצהיר ולאתחל את רשימת המערכים בין אם אתה משתמש בזרמים או בשיטת חילוץ אחרת. מה שלא היית צריך לעשות אם אתה משתמש בזרמים הוא להכריז על משתנה חדש שיחזיק את הערכים הנדרשים, ולא ליצור את חמש שורות הקוד האחרות בתוספת בדוגמה לעיל.
קָשׁוּר: כיצד ליצור ולבצע פעולות במערכים בג'אווה
הקוד שלמעלה מפיק את הפלט הבא במסוף:
C11
C12
C13
C14
C15
C16
חיים עם זרמים
בתכנות, יעילות מדברת על הפקת אותה תוצאה עם פחות קוד משמעותי. זה בדיוק מה שצינור זרם עושה למתכנת. אז בפעם הבאה שמישהו שואל: "למה חשוב להשתמש בזרמים בפרויקט שלך?" במילים פשוטות: "זרמים תומכים בתכנות יעיל."
בהמשך לדוגמה שלנו לעיל, ככה הצגת זרמים הופכת את התוכנית כולה.
סינון ומיון ערכים עם דוגמה לזרם
ייבא java.util. מערכים;
ייבא java.util. רשימה;
מעמד ציבורי ראשי {
ראשי סטטי ציבורי ריק (מחרוזת [] טוען) {
// להכריז ולאתחל את רשימת המערכים
רשימה randomValues = Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// מאחזר רק ערכים שמתחילים ב- C, ממיין אותם ומדפיס אותם למסוף.
randomValues.stream (). filter (value-> value.startsWith ("C")). ממוין (). forEach (System.out:: println);
}
}
הקוד שלמעלה מדגים עד כמה ממשק הזרם חזק. זה לוקח רשימה של ערכי מערך אקראיים והופך אותו לזרם באמצעות ה- זרם() פוּנקצִיָה. לאחר מכן הזרם מצטמצם לרשימת מערכים המכילה את הערכים הנדרשים (שהם כל הערכים שמתחילים איתם ג), משתמש ב לְסַנֵן() פוּנקצִיָה.
כפי שניתן לראות בדוגמה לעיל, ה- ג ערכים מסודרים באופן אקראי ברשימת המערכים. אם היית מדפיס את הזרם בשלב זה בצינור, הערך C15 היה מודפס תחילה. לכן, ה סוג() פונקציה מוצגת לצינור הזרם כדי לסדר מחדש את המערך החדש בסדר עולה.
הפונקציה הסופית בצינור הזרם היא א לכל אחד() פוּנקצִיָה. זוהי פונקציית מסוף המשמשת לעצירת צינור הזרם ומייצרת את התוצאות הבאות במסוף:
C11
C12
C13
C14
C15
C16
יש רשימה מקיפה של פעולות ביניים בהן ניתן להשתמש בצינור זרם.
צינור זרם מתחיל תמיד במקור יחיד וב- זרם() פונקציה, ותמיד מסתיים בפעולת מסוף אחת (אם כי ישנם מספר פעולות שונות בחר בין.) אבל בין שני החלקים האלה יש רשימה של שש פעולות ביניים שתוכלו להשתמש.
בדוגמה שלנו לעיל, משתמשים רק בשניים מפעולות ביניים אלהלְסַנֵן() ו סוג(). פעולת הביניים שתבחר תלויה במשימות שברצונך לבצע.
אם אחד מהערכים שמתחילים ב- "C" ברשימת המערכים שלנו לעיל היה באותיות קטנות, וביצענו עליהם אותן פעולות ביניים, היינו מקבלים את התוצאה הבאה.
ביצוע פעולות סינון ומיון לפי ערכים קטנים
ייבא java.util. מערכים;
ייבא java.util. רשימה;
מעמד ציבורי ראשי {
ראשי סטטי ציבורי ריק (מחרוזת [] טוען) {
// להכריז ולאתחל את רשימת המערכים
רשימה randomValues = Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// מאחזר רק ערכים שמתחילים ב- C, ממיין אותם ומדפיס אותם למסוף.
randomValues.stream (). filter (value-> value.startsWith ("C")). ממוין (). forEach (System.out:: println);
}
}
הקוד שלמעלה יפיק את הערכים הבאים במסוף:
C11
C12
C14
C15
הבעיה היחידה עם הפלט שלעיל היא שהיא לא מייצגת במדויק את כל ה- ג ערכים ברשימת המערכים שלנו. דרך טובה לתקן את השגיאה הקטנה הזו היא להכניס פעולת ביניים נוספת לצינור הזרם; פעולה זו מכונה מַפָּה() פוּנקצִיָה.
שימוש בדוגמת פונקציית מפה
ייבא java.util. מערכים;
ייבא java.util. רשימה;
מעמד ציבורי ראשי {
ראשי סטטי ציבורי ריק (מחרוזת [] טוען) {
// להכריז ולאתחל את רשימת המערכים
רשימה randomValues = Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// הופך את כל התווים הקטנים לקטנה,
// מאחזר רק ערכים שמתחילים ב- C, ממיין אותם ומדפיס אותם למסוף.
randomValues.stream (). מפה (String:: toUpperCase) .filter (value-> value.startsWith ("C")). מיון (). forEach (System.out:: println);
}
}
ה מַפָּה() פונקציה הופכת אובייקט ממצב אחד למשנהו; בדוגמה שלנו לעיל זה הופך את כל התווים הקטנים ברשימת המערכים לתווים גדולים.
הצבת ה- מַפָּה() פונקציה רגע לפני לְסַנֵן() פונקציה מאחזרת את כל הערכים שמתחילים איתם ג מרשימת המערכים.
הקוד שלמעלה מייצר את התוצאה הבאה במסוף, המייצג בהצלחה את כל ה- ג ערכים ברשימת המערכים.
C11
C12
C13
C14
C15
C16
שלושת פעולות הביניים האחרות בהן תוכלו להשתמש ביישומים שלכם כוללות:
- לְהָצִיץ()
- לְהַגבִּיל()
- לדלג()
זרמי Java 8 מקלים על יצירת קוד יעיל
בעזרת זרמי Java 8 תוכלו לחלץ נתונים ספציפיים ורלוונטיים ממקור גדול עם שורת קוד אחת. כל עוד אתה כולל את ההתחלה זרם() פונקציה ומפעיל מסוף, אתה יכול להשתמש בכל שילוב של פעולות ביניים המספקות תפוקות מתאימות למטרה שלך.
אם אתה תוהה לגבי שורת הקוד הכלולה בתוך שלנו לְסַנֵן() פוּנקצִיָה; זה מכונה "ביטוי למבדה". ביטויים למבדה הם תכונה נוספת שהוצגה עם Java 8, ויש בה הרבה נאגטס שעשויים להיות לכם שימושיים.
אם אתה מתכנת Java ומעוניין ללמוד עוד על Java 8 lambdas, במאמר זה אנו נבחן מקרוב את התחביר והשימוש של lambda.
קרא הבא
- תִכנוּת
- ג'אווה
- הדרכות קידוד
Kadeisha Kean היא תוכנת Full-Stack תוכנה וסופרת טכנית / טכנולוגית. יש לה יכולת מובהקת לפשט כמה מהמושגים הטכנולוגיים המורכבים ביותר; הפקת חומר שניתן להבין בקלות על ידי כל טירון טכנולוגי. היא נלהבת לכתוב, לפתח תוכנות מעניינות ולנסוע בעולם (באמצעות סרטי תעודה).
הירשם לניוזלטר שלנו
הצטרף לניוזלטר שלנו לקבלת טיפים טכניים, ביקורות, ספרים אלקטרוניים בחינם ומבצעים בלעדיים!
צעד אחד נוסף !!!
אנא אשר את כתובת הדוא"ל שלך בדוא"ל ששלחנו לך זה עתה.