Java 8 Stream findFirst () לעומת findAny ()

1. הקדמה

ג'אווה 8 זרם API הציג שתי שיטות שלעתים קרובות לא מובנות בצורה לא נכונה: findAny () ו findFirst ().

במדריך מהיר זה, נבחן את ההבדל בין שתי השיטות הללו ומתי להשתמש בהן.

2. באמצעות Stream.findAny ()

כפי שהשם מרמז, findAny () השיטה מאפשרת לך למצוא כל אלמנט מ- זרם. השתמש בו כאשר אתה מחפש אלמנט מבלי לשים לב לסדר המפגש:

השיטה מחזירה אופציונאלי מופע שהוא ריק אם זרם זה ריק:

@Test ציבורי בטל createStream_whenFindAnyResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); תוצאה אופציונלית = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is ("A"), is ("B"), is ("C"), is ("D"))); }

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

לביצועים מרביים בעת עיבוד הפעולה המקבילה לא ניתן לקבוע את התוצאה באופן מהימן:

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {List list = Arrays.asList (1, 2, 3, 4, 5); תוצאה אופציונלית = רשימה .stream (). מקבילית () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is (1), is (2), is (3))); }

3. באמצעות Stream.findFirst ()

ה findFirst () השיטה מוצאת את האלמנט הראשון ב- זרם. ברור ששיטה זו משמשת כשאתה רוצה ספציפית את האלמנט הראשון מתוך רצף.

כשאין סדר מפגש הוא מחזיר כל אלמנט מה- זרם. ה java.util.streams בתיעוד החבילה כתוב:

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

סוג ההחזרה הוא גם אופציונאלי מופע שהוא ריק אם זרם גם הוא ריק:

@Test ציבורי בטל createStream_whenFindFirstResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); תוצאה אופציונלית = list.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (result.get (), הוא ("A")); }

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

4. מסקנה

במדריך זה, הסתכלנו על findAny () ו findFirst () שיטות ה- Java 8 Streams API. ה findAny () השיטה מחזירה כל אלמנט מ- זרם בזמן ש findFirst () השיטה מחזירה את האלמנט הראשון ב- זרם.

תוכל למצוא את קוד המקור השלם ואת כל קטעי הקוד עבור מאמר זה ב- GitHub.