Sådan spilder du over en strøm med indekser

1. Oversigt

Java 8 Strømme er ikke samlinger, og der er ikke adgang til elementer ved hjælp af deres indekser, men der er stadig et par tricks for at gøre dette muligt.

I denne korte artikel vil vi se på, hvordan man gentager sig over en Strøm ved brug af IntStream, StreamUtils, EntryStream, og Vavr'S Strøm.

2. Brug af almindelig Java

Vi kan navigere gennem en Strøm ved hjælp af en Heltal rækkevidde, og også drage fordel af det faktum, at de originale elementer er i en matrix eller en samling tilgængelig med indekser.

Lad os implementere en metode, der gentager sig med indekser og demonstrerer denne tilgang.

Kort sagt, vi ønsker at få en række Strenge og vælg kun lige indekserede elementer:

offentlig liste getEvenIndexedStrings (String [] navne) {List evenIndexedNames = IntStream .range (0, names.length) .filter (i -> i% 2 == 0) .mapToObj (i -> names [i]) .collect ( Collectors.toList ()); returner selvIndexedNames; }

Lad os nu teste implementeringen:

@Test offentlig ugyldig, nårCalled_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Liste expectResult = Arrays.asList ("Afrim", "Besim", "Durim"); Liste actualResult = StreamIndices.getEvenIndexedStrings (navne); assertEquals (forventet resultat, faktisk resultat); }

3. Brug StreamUtils

En anden måde at gentage med indeks kan gøres ved hjælp af zipWithIndex () metode til StreamUtils fra proton-pakke bibliotek (den seneste version kan findes her).

Først skal du føje det til din pom.xml:

 com.codepoetics protonpack 1.13 

Lad os nu se på koden:

offentlig liste getEvenIndexedStrings (List names) {Liste liste = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); returliste }

Følgende tester denne metode og gennemføres med succes:

@Test offentlig ugyldig nårCalled_thenReturnListOfEvenIndexedStrings () {List names = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); Liste expectResult = Arrays.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); Liste actualResult = StreamIndices.getEvenIndexedStrings (navne); assertEquals (forventet resultat, faktisk resultat); }

4. Brug StreamEx

Vi kan også gentage med indekser ved hjælp af filterKeyValue () af EntryStream klasse fra StreamEx bibliotek (den seneste version kan findes her). Først skal vi tilføje det til vores pom.xml:

 one.util streamex 0.6.5 

Lad os se en enkel anvendelse af denne metode ved hjælp af vores tidligere eksempel:

public List getEvenIndexedStringsVersionTwo (List names) {return EntryStream.of (names) .filterKeyValue ((index, name) -> index% 2 == 0) .values ​​() .toList (); }

Vi bruger en lignende test til at teste dette:

@Test offentlig ugyldig nårCalled_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Liste expectResult = Arrays.asList ("Afrim", "Besim", "Durim"); Liste actualResult = StreamIndices.getEvenIndexedStrings (navne); assertEquals (forventet resultat, faktisk resultat); }

5. Iteration ved hjælp af Vavre'S Strøm

En anden plausibel måde til iteration er at bruge zipWithIndex () metode til Vavr (tidligere kendt som Javaslang) 's Strøm implementering:

offentlig liste getOddIndexedStringsVersionTwo (String [] navne) {return Stream .of (names) .zipWithIndex () .filter (tuple -> tuple._2% 2 == 1) .map (tuple -> tuple._1) .toJavaList () ; }

Vi kan teste dette eksempel med følgende metode:

@Test offentlig ugyldig nårCalled_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Liste expectResult = Arrays.asList ("Bashkim", "Lulzim", "Shpetim"); Liste actualResult = StreamIndices.getOddIndexedStringsVersionTwo (navne); assertEquals (forventet resultat, faktisk resultat); }

Hvis du vil læse mere om Vavr, skal du tjekke denne artikel.

6. Konklusion

I denne hurtige vejledning så vi fire tilgange til, hvordan man itererer gennem strømme ved hjælp af indekser. Strømme har fået en masse opmærksomhed, og det kan være nyttigt at kunne gentage dem gennem indekser.

Der er mange funktioner, der er inkluderet i Java 8 Streams, hvoraf nogle allerede er dækket på Baeldung.

Koden til alle eksemplerne forklaret her og meget mere kan findes på GitHub.


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