Hvordan jegere over en strøm med indekser

1. Oversikt

Java 8 Strømmer er ikke samlinger, og det er ikke tilgang til elementer ved hjelp av indeksene, men det er fortsatt noen triks for å gjøre dette mulig.

I denne korte artikkelen skal vi se på hvordan man kan iterere over en Strøm ved hjelp av IntStream, StreamUtils, EntryStream, og Vavr‘S Strøm.

2. Bruke vanlig Java

Vi kan navigere gjennom en Strøm bruker en Heltall rekkevidde, og drar også nytte av det faktum at de originale elementene er i en matrise eller en samling som er tilgjengelig med indekser.

La oss implementere en metode som gjentas med indekser og demonstrerer denne tilnærmingen.

Enkelt sagt, vi ønsker å få en rekke Strenger og velg bare jevne indekserte elementer:

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

La oss nå teste ut 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 (navn); assertEquals (expectResult, actualResult); }

3. Bruke StreamUtils

En annen måte å gjenta med indekser kan gjøres ved hjelp av zipWithIndex () Metode av StreamUtils fra proton-pakke bibliotek (den siste versjonen finner du her).

Først må du legge den til din pom.xml:

 com.codepoetics protonpack 1.13 

La oss nå se på koden:

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

Følgende tester denne metoden og består vellykket:

@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 (navn); assertEquals (expectResult, actualResult); }

4. Bruke StreamEx

Vi kan også gjenta med indekser ved hjelp av filterKeyValue () av EntryStream klasse fra StreamEx bibliotek (den siste versjonen finner du her). Først må vi legge det til vårt pom.xml:

 one.util streamex 0.6.5 

La oss se en enkel anvendelse av denne metoden ved hjelp av vårt forrige eksempel:

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

Vi bruker en lignende test for å 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 (navn); assertEquals (expectResult, actualResult); }

5. Iterasjon ved hjelp av Vavre‘S Strøm

En annen sannsynlig måte å iterere er å bruke zipWithIndex () Metode av Vavr (tidligere kjent som Javaslang) s Strøm gjennomføring:

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

Vi kan teste dette eksemplet 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 (navn); assertEquals (expectResult, actualResult); }

Hvis du vil lese mer om Vavr, kan du sjekke denne artikkelen.

6. Konklusjon

I denne raske opplæringen så vi fire tilnærminger til hvordan man kan iterere gjennom strømmer ved hjelp av indekser. Strømmer har fått mye oppmerksomhet, og det å være i stand til å gjenta dem gjennom indekser kan være nyttig.

Det er mange funksjoner som er inkludert i Java 8 Streams, hvorav noen allerede er dekket på Baeldung.

Koden for alle eksemplene som er forklart her, og mye mer finner du på GitHub.


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