זרמי Java למתחילים: מבוא לשימוש בזרמים ב- Java

זרמי Java למתחילים: מבוא לשימוש בזרמים ב- Java

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





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





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





מהו נחל?

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

כיצד פועלים זרמים

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



כדי להפוך את האוסף לזרם ראשוני, יהיה עליך להוסיף את זרם() פונקציה למקור. זה ימקם את המקור לצינור הנחל שבו מספר פעולות ביניים שונות (כגון לְסַנֵן() ו סוג() ) יכול לפעול על זה.

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





חיים ללא זרמים

Java 8 שוחרר בשנת 2014, אך לפני כן, מפתחי Java עדיין היו צריכים לחלץ נתונים מיוחדים מאוסף נתונים כלליים.

כיצד להכניס שורה במילה 2016

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





קָשׁוּר: מה שאתה צריך לדעת על שימוש במחרוזות ב- Java

סינון ומיון ערכים ללא זרמים דוגמה


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//declare the array list will store needed values
List requiredValues = new ArrayList();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith('C')) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}

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

קָשׁוּר: כיצד ליצור ולבצע פעולות במערכים בג'אווה

הקוד למעלה מייצר את הפלט הבא במסוף:


C11
C12
C13
C14
C15
C16

חיים עם זרמים

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

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

סינון ומיון ערכים באמצעות דוגמא לזרם


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

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

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

הפונקציה הסופית בצינור הזרם היא א לכל אחד() פוּנקצִיָה. זוהי פונקציית מסוף המשמשת לעצירת צינור הזרם ומייצרת את התוצאות הבאות במסוף:


C11
C12
C13
C14
C15
C16

זרם פעולות ביניים

יש רשימה נרחבת של פעולות ביניים שניתן להשתמש בהן בצינור זרם.

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

בדוגמה שלנו לעיל, משתמשים רק בשתי פעולות ביניים אלה --- לְסַנֵן() ו סוג() . פעולת הביניים שתבחר תלויה במשימות שאתה רוצה לבצע.

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

ביצוע פעולות סינון ומיון על ערכים קטנים


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

הקוד למעלה יפיק את הערכים הבאים במסוף:


C11
C12
C14
C15

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

שימוש בדוגמא של פונקציית המפה


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

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

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

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


C11
C12
C13
C14
C15
C16

שלוש פעולות הביניים האחרות בהן תוכל להשתמש ביישומים שלך כוללות:

  • לְהָצִיץ()
  • לְהַגבִּיל()
  • לדלג()

זרמי Java 8 מאפשרים יצירת קוד יעיל

עם זרמי Java 8 תוכל לחלץ נתונים ספציפיים ורלוונטיים במיוחד ממקור גדול עם שורת קוד אחת. כל עוד אתה מצרף את ראשי התיבות זרם() פונקציה ומפעיל מסוף, אתה יכול להשתמש בכל שילוב של פעולות ביניים המספקות תפוקות מתאימות למטרה שלך.

דוא"ל איפוס הסיסמה של פלייסטיישן לא התקבל

אם אתה תוהה לגבי שורת הקוד הכלולה בתוך לְסַנֵן() פוּנקצִיָה; הוא ידוע בשם 'ביטוי למבדה'. ביטויי למבדה הם תכונה נוספת שהוצגה עם Java 8, ויש לה הרבה גושים שעשויים להועיל לך.

לַחֲלוֹק לַחֲלוֹק צִיוּץ אימייל היכרות מהירה עם Java 8 Lambdas

אם אתה מתכנת ג'אווה ואתה מעוניין ללמוד יותר על Java 8 lambdas, במאמר זה נבחן מקרוב את תחביר הלמדה והשימוש בה.

קרא הבא
נושאים קשורים
  • תִכנוּת
  • ג'אווה
  • הדרכות קידוד
על הסופר קדישא קין(פורסמו 21 מאמרים)

Kadeisha Kean היא מפתחת תוכנה מלאה וכותבת טכנית/טכנולוגית. יש לה את היכולת המובהקת לפשט כמה מהמושגים הטכנולוגיים המורכבים ביותר; לייצר חומר שניתן להבין אותו בקלות על ידי כל טירון טכנולוגי. היא נלהבת לכתוב, לפתח תוכנות מעניינות ולטייל ברחבי העולם (באמצעות סרטים דוקומנטריים).

עוד מ- Kadeisha Kean

הירשם לניוזלטר שלנו

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

לחצו כאן להרשמה