Hoe te herhalen over een stroom met indices

1. Overzicht

Java 8 Streams zijn geen verzamelingen en elementen zijn niet toegankelijk met behulp van hun indices, maar er zijn nog een paar trucs om dit mogelijk te maken.

In dit korte artikel gaan we kijken hoe we een Stroom gebruik makend van IntStream, StreamUtils, EntryStream, en Vavr‘S Stroom.

2. Gebruik gewoon Java

We kunnen navigeren door een Stroom met behulp van een Geheel getal bereik, en profiteren ook van het feit dat de originele elementen zich in een array of een verzameling bevinden die toegankelijk is via indices.

Laten we een methode implementeren die itereert met indices en deze benadering demonstreert.

Simpel gezegd, we willen een reeks van Snaren en selecteer alleen even geïndexeerde elementen:

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

Laten we nu de implementatie testen:

@Test openbare leegte whenCalled_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lijst verwachteResult = Arrays.asList ("Afrim", "Besim", "Durim"); Lijst actualResult = StreamIndices.getEvenIndexedStrings (namen); assertEquals (verwachtResultaat, actueelResultaat); }

3. Met behulp van StreamUtils

Een andere manier om met indices te herhalen, kan worden gedaan met zipWithIndex () methode van StreamUtils van de proton-pakket bibliotheek (de laatste versie is hier te vinden).

U moet het eerst toevoegen aan uw pom.xml:

 com.codepoetics protonpack 1.13 

Laten we nu eens kijken naar de code:

openbare lijst getEvenIndexedStrings (lijstnamen) {List list = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); retourlijst; }

De volgende test deze methode en slaagt met succes:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {List names = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); Lijst verwachteResult = Arrays.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); Lijst actualResult = StreamIndices.getEvenIndexedStrings (namen); assertEquals (verwachtResultaat, actueelResultaat); }

4. Met behulp van StreamEx

We kunnen ook itereren met indexen met behulp van filterKeyValue () van EntryStream klas van StreamEx bibliotheek (de laatste versie is hier te vinden). Eerst moeten we het toevoegen aan ons pom.xml:

 one.util streamex 0.6.5 

Laten we een eenvoudige toepassing van deze methode bekijken met behulp van ons vorige voorbeeld:

openbare lijst getEvenIndexedStringsVersionTwo (lijstnamen) {return EntryStream.of (namen) .filterKeyValue ((index, naam) -> index% 2 == 0) .values ​​() .toList (); }

We zullen een vergelijkbare test gebruiken om dit te testen:

@Test openbaar ongeldig whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lijst verwachteResult = Arrays.asList ("Afrim", "Besim", "Durim"); Lijst actualResult = StreamIndices.getEvenIndexedStrings (namen); assertEquals (verwachtResultaat, actueelResultaat); }

5. Iteratie met Vavre‘S Stroom

Een andere plausibele manier van iteratie is het gebruik van zipWithIndex () methode van Vavr (voorheen bekend als Javaslang) 's Stroom implementatie:

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

We kunnen dit voorbeeld testen met de volgende methode:

@Test openbaar ongeldig whenCalled_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lijst verwachteResult = Arrays.asList ("Bashkim", "Lulzim", "Shpetim"); Lijst actualResult = StreamIndices.getOddIndexedStringsVersionTwo (namen); assertEquals (verwachtResultaat, actueelResultaat); }

Als je meer wilt lezen over Vavr, bekijk dan dit artikel.

6. Conclusie

In deze korte tutorial hebben we vier benaderingen gezien voor het doorlopen van streams met behulp van indices. Streams hebben veel aandacht gekregen en het kan nuttig zijn om ze ook te kunnen herhalen met indices.

Er zijn veel functies die zijn opgenomen in Java 8 Streams, waarvan sommige al worden behandeld op Baeldung.

De code voor alle voorbeelden die hier worden uitgelegd, en nog veel meer, is te vinden op GitHub.