הַSpliterator של Java הוּא אחד מ־ארבעת המְסַנְנִים – Enumeration, Iterator, ListIterator וְSpliterator.
Java Spliterator
כְּמוֹ Iterator וְListIterator, Spliterator הוּא Iterator של Java, שֶׁמֻּשְׁתָּמֵשׁ בְּמִימוּשׁ לְאֵלֶמֶנְטִים בְּאוֹבִיֵּקט שֶׁיֻּמְמַשְׁתָּמָה. כְּמה נְקוּדוֹת חֲשׁוּבוֹת עַל Spliterator של Java הֵם:
- הַSpliterator של Java הוּא מְמִשְׁק בְּAPI שֶׁל Collection שֶׁל Java.
- הובא הַSpliterator בְּגרסָת Java 8 בְּחבילָה שֶׁל
java.util
. - הוּא תוֹמֵךְ בְּפּוֹטֶנְצְיָאל שֶׁל תַּכְנוּת תְּכַנְתִּיָה.
- נִיתָן לִשְׁפּוֹט אֹתוֹ לִשְׁנֵי תַּכְנוּיוֹת שֶׁל API שֶׁל Collection וְStream.
- הוּא מַסְפִּיק תּוֹכְנוֹת עַל אוֹבְיָקטִים שֶׁל Collection אוֹ API.
- אֵין אֶפְשָׁרוּת לְהִשְׁתַּמֵּשׁ בּוֹ עַבוֹר Map מֻמְמַשְׁתָּמָה.
- הוא משתמש בשיטת
tryAdvance()
כדי לעבור על איברים בנפרד במספר תהליכים כדי לתמוך בעיבוד פרללי. - הוא משתמש בשיטת
forEachRemaining()
כדי לעבור על איברים בסדר רציף בתהליך יחיד. - הוא משתמש בשיטת
trySplit()
כדי לחלק את עצמו לתת-פוצצים כדי לתמוך בעיבוד פרללי. - Spliterator תומך בכל עיבוד סדרתי ופרללי של נתונים.
Spliterator עצמו לא מספק את התנהגות התכנות הפרללי. אך, הוא מספק כמה שיטות לתמיכה בזה. מפתחים צריכים להשתמש בשיטות ממשק ה-Spliterator וליישם תכנות פרללי באמצעות מסגרת Fork/Join (אחד מתוך הדרכים הטובות).
פונקציות עיקריות של Spliterator
- חלוקת נתוני המקור.
- עיבוד נתוני המקור.
תרשים מחלקה של Spliterator ב-Java
התרשים הבא מציג את תרשים המחלקה של ממשק ה-Spliterator ב-Java. יש בו מספר שדות ושיטות.
שיטות של Spliterator ב-Java
בחלק זה, נפרט את כל שיטות ה-Spliterator של Java אחת אחת עם תיאור שימושי.
- int characteristics(): מחזירה ערכת תכונות של ה-Spliterator הזה והאלמנטים שלו.
- long estimateSize(): מחזירה הערכה של מספר האלמנטים שיתקלו בטיול forEachRemaining(), או מחזירה Long.MAX_VALUE אם אינסופי, לא ידוע, או יקר מדי לחישוב.
- default void forEachRemaining(Consumer action): מבצעת את הפעולה הנתונה עבור כל אלמנט שנותר, ברצף באשך הנוכחי, עד שכל האלמנטים עובדו או שהפעולה גורמת לחריג.
- default Comparator getComparator(): אם מקור ה-Spliterator הזה ממוין על ידי Comparator, מחזיר את ה-Comparator ההוא.
- default long getExactSizeIfKnown(): שיטת נוחות שמחזירה את estimateSize() אם ה-Spliterator הזה ממדד, אחרת -1.
- default boolean hasCharacteristics(int characteristics): מחזירה true אם התכונות של ה-Spliterator הזה כוללות את כל התכונות הנתונות.
- boolean tryAdvance(Consumer action): אם קיים אלמנט נותר, מבצעת את הפעולה הנתונה עליו, מחזירה true; אחרת מחזירה false.
- Spliterator trySplit(): אם ה-Spliterator הזה יכול להתחלק, מחזיר Spliterator שכולל אלמנטים, שלאחר חזרה מהשיטה הזו, לא יכוסו על ידי ה-Spliterator הזה.
דוגמא ל-Spliterator של Java
במקטע זה, נדון בכיצד ליצור אובייקט Spliterator של Java באמצעות השיטה spliterator() ונפתח דוגמה פשוטה.
import java.util.Spliterator;
import java.util.ArrayList;
import java.util.List;
public class SpliteratorSequentialIteration
{
public static void main(String[] args)
{
List names = new ArrayList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// קבלת Spliterator
Spliterator namesSpliterator = names.spliterator();
// עובר על אלמנטים
namesSpliterator.forEachRemaining(System.out::println);
}
}
פלט:-
Rams
Posa
Chinni
אם נצפה על התוכנית והפלט לעיל, נוכל להבין בקלות ששיטת Spliterator.forEachRemaining() פועלת באותו אופן כמו foreach() של ArrayList. כן, שתי השיטות פועלות באופן דומה.
יתרונות של Spliterator
-
בניגוד ל Iterator ו־ListIterator, היא תומכת בפונקציות תכנות מקביליות.
-
בניגוד ל Iterator ו־ListIterator, היא תומכת גם בעיבוד סדרתי ומקבילי של נתונים.
-
בהשוואה לאיטרטורים אחרים, היא מספקת ביצועים טובים יותר.
Iterator נגד Spliterator
Iterator | Spliterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.8. |
It is an Iterator for whole Collection API. | It is an Iterator for both Collection and Stream API, except Map implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It does NOT support Parallel Programming. | It supports Parallel Programming. |
זהו כל מה שצריך לדעת על Spliterator ב־Java. מקור: מסמך API
Source:
https://www.digitalocean.com/community/tutorials/java-spliterator