כיצד להתבשל מעל זרם עם מדדים

1. סקירה כללית

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

במאמר קצר זה, נבחן כיצד לחזור על א זרם באמצעות IntStream, StreamUtils, EntryStream, ו Vavrשל זרם.

2. שימוש ב- Java רגיל

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

בואו ליישם שיטה שמתנגדת במדדים ומדגימה גישה זו.

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

רשימה ציבורית getEvenIndexedStrings (מחרוזת [] שמות) {רשימה evenIndexedNames = IntStream .range (0, names.length) .filter (i -> i% 2 == 0) .mapToObj (i -> names [i]) .collect ( Collectors.toList ()); להחזיר evenIndexedNames; }

בואו נבדוק כעת את היישום:

@ מבחן פומבי בטל כאשר Called_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; רשימה expectResult = Arrays.asList ("אפרים", "בסים", "דורים"); רשימה actualResult = StreamIndices.getEvenIndexedStrings (שמות); assertEquals (expectResult, actualResult); }

3. שימוש StreamUtils

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

ראשית, עליך להוסיף אותו ל- pom.xml:

 com.codepoetics protonpack 1.13 

עכשיו, בואו נסתכל על הקוד:

רשימה ציבורית getEvenIndexedStrings (שמות רשימות) {רשימה list = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); רשימת החזרה; }

להלן בדיקה של שיטה זו ועוברת בהצלחה:

@ מבחן פומבי בטל כאשר Called_thenReturnListOfEvenIndexedStrings () {List names = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); רשימה expectResult = Arrays.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); רשימה actualResult = StreamIndices.getEvenIndexedStrings (שמות); assertEquals (expectResult, actualResult); }

4. שימוש StreamEx

אנחנו יכולים גם לחזור על אינדקסים באמצעות filterKeyValue () שֶׁל EntryStream כיתה מ StreamEx הספרייה (הגרסה האחרונה תוכל למצוא כאן). ראשית, עלינו להוסיף אותו לשלנו pom.xml:

 one.util streamex 0.6.5 

בואו נראה יישום פשוט של שיטה זו תוך שימוש בדוגמה הקודמת שלנו:

רשימה ציבורית getEvenIndexedStringsVersionTwo (שמות רשימה) {return EntryStream.of (names) .filterKeyValue ((index, name) -> index% 2 == 0) .values ​​() .toList (); }

נשתמש במבחן דומה כדי לבדוק זאת:

@ מבחן פומבי בטל כאשר Called_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; רשימה expectResult = Arrays.asList ("אפרים", "בסים", "דורים"); רשימה actualResult = StreamIndices.getEvenIndexedStrings (שמות); assertEquals (expectResult, actualResult); }

5. איטרציה באמצעות Vavreשל זרם

דרך סבירה נוספת של איטרציה היא שימוש zipWithIndex () שיטה של Vavr (ידוע בעבר בשם ג'וואסלאנג) של זרם יישום:

רשימה ציבורית getOddIndexedStringsVersionTwo (שמות מחרוזת []) {Return Stream .of (names) .zipWithIndex () .filter (tuple -> tuple._2% 2 == 1) .map (tuple -> tuple._1) .toJavaList () ; }

אנו יכולים לבדוק דוגמה זו בשיטה הבאה:

@ מבחן פומבי בטל כאשר Called_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; רשימה expectResult = Arrays.asList ("בשקים", "לולזים", "שפטים"); רשימה actualResult = StreamIndices.getOddIndexedStringsVersionTwo (שמות); assertEquals (expectResult, actualResult); }

אם אתה רוצה לקרוא עוד על Vavr, עיין במאמר זה.

6. מסקנה

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

יש הרבה תכונות הכלולות ב- Java 8 Streams, חלקן כבר מכוסות ב- Baeldung.

הקוד לכל הדוגמאות המוסברות כאן, ועוד ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found