Java Spliterator

הַSpliterator של Java הוּא אחד מ־ארבעת המְסַנְנִים – Enumeration, Iterator, ListIterator וְSpliterator.

Java Spliterator

כְּמוֹ Iterator וְListIterator, Spliterator הוּא Iterator של Java, שֶׁמֻּשְׁתָּמֵשׁ בְּמִימוּשׁ לְאֵלֶמֶנְטִים בְּאוֹבִיֵּקט שֶׁיֻּמְמַשְׁתָּמָה. כְּמה נְקוּדוֹת חֲשׁוּבוֹת עַל Spliterator של Java הֵם:

  1. הַSpliterator של Java הוּא מְמִשְׁק בְּAPI שֶׁל Collection שֶׁל Java.
  2. הובא הַSpliterator בְּגרסָת Java 8 בְּחבילָה שֶׁל java.util.
  3. הוּא תוֹמֵךְ בְּפּוֹטֶנְצְיָאל שֶׁל תַּכְנוּת תְּכַנְתִּיָה.
  4. נִיתָן לִשְׁפּוֹט אֹתוֹ לִשְׁנֵי תַּכְנוּיוֹת שֶׁל API שֶׁל Collection וְStream.
  5. הוּא מַסְפִּיק תּוֹכְנוֹת עַל אוֹבְיָקטִים שֶׁל Collection אוֹ API.
  6. אֵין אֶפְשָׁרוּת לְהִשְׁתַּמֵּשׁ בּוֹ עַבוֹר Map מֻמְמַשְׁתָּמָה.
  7. הוא משתמש בשיטת tryAdvance() כדי לעבור על איברים בנפרד במספר תהליכים כדי לתמוך בעיבוד פרללי.
  8. הוא משתמש בשיטת forEachRemaining() כדי לעבור על איברים בסדר רציף בתהליך יחיד.
  9. הוא משתמש בשיטת trySplit() כדי לחלק את עצמו לתת-פוצצים כדי לתמוך בעיבוד פרללי.
  10. Spliterator תומך בכל עיבוד סדרתי ופרללי של נתונים.

Spliterator עצמו לא מספק את התנהגות התכנות הפרללי. אך, הוא מספק כמה שיטות לתמיכה בזה. מפתחים צריכים להשתמש בשיטות ממשק ה-Spliterator וליישם תכנות פרללי באמצעות מסגרת Fork/Join (אחד מתוך הדרכים הטובות).

פונקציות עיקריות של Spliterator

  • חלוקת נתוני המקור.
  • עיבוד נתוני המקור.

תרשים מחלקה של Spliterator ב-Java

התרשים הבא מציג את תרשים המחלקה של ממשק ה-Spliterator ב-Java. יש בו מספר שדות ושיטות.

שיטות של Spliterator ב-Java

בחלק זה, נפרט את כל שיטות ה-Spliterator של Java אחת אחת עם תיאור שימושי.

  1. int characteristics(): מחזירה ערכת תכונות של ה-Spliterator הזה והאלמנטים שלו.
  2. long estimateSize(): מחזירה הערכה של מספר האלמנטים שיתקלו בטיול forEachRemaining(), או מחזירה Long.MAX_VALUE אם אינסופי, לא ידוע, או יקר מדי לחישוב.
  3. default void forEachRemaining(Consumer action): מבצעת את הפעולה הנתונה עבור כל אלמנט שנותר, ברצף באשך הנוכחי, עד שכל האלמנטים עובדו או שהפעולה גורמת לחריג.
  4. default Comparator getComparator(): אם מקור ה-Spliterator הזה ממוין על ידי Comparator, מחזיר את ה-Comparator ההוא.
  5. default long getExactSizeIfKnown(): שיטת נוחות שמחזירה את estimateSize() אם ה-Spliterator הזה ממדד, אחרת -1.
  6. default boolean hasCharacteristics(int characteristics): מחזירה true אם התכונות של ה-Spliterator הזה כוללות את כל התכונות הנתונות.
  7. boolean tryAdvance(Consumer action): אם קיים אלמנט נותר, מבצעת את הפעולה הנתונה עליו, מחזירה true; אחרת מחזירה false.
  8. 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

  1. בניגוד ל Iterator ו־ListIterator, היא תומכת בפונקציות תכנות מקביליות.

  2. בניגוד ל Iterator ו־ListIterator, היא תומכת גם בעיבוד סדרתי ומקבילי של נתונים.

  3. בהשוואה לאיטרטורים אחרים, היא מספקת ביצועים טובים יותר.

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