Hogyan kell iterálni egy adatfolyam felett indexekkel

1. Áttekintés

Java 8 Patakok nem gyűjtemények, és az elemek nem érhetők el az indexeik segítségével, de ennek ellenére még van néhány trükk.

Ebben a rövid cikkben megvizsgáljuk, hogyan kell iterálni a Folyam felhasználásával IntStream, StreamUtils, EntryStream, és Vavr’S Folyam.

2. A Plain Java használata

Navigálhatunk a Folyam egy an használatával Egész szám tartományban, és profitálnak abból is, hogy az eredeti elemek tömbben vagy gyűjteményben találhatók, indexekkel elérhetőek.

Vezessünk be egy módszert, amely indexekkel iterál és bemutatja ezt a megközelítést.

Egyszerűen fogalmazva, szeretnénk egy tömböt kapni Húrok és csak az indexelt elemeket válassza ki:

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

Próbáljuk ki most a megvalósítást:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List várhatóResult = Arrays.asList ("Afrim", "Besim", "Durim"); Sorolja fel a actualResult = StreamIndices.getEvenIndexedStrings (neveket); assertEquals (várható eredmény, tényleges eredmény); }

3. Használata StreamUtils

Az indexekkel történő iterálás másik módja a zipWithIndex () a metódusa StreamUtils tól proton-csomag könyvtár (a legfrissebb verzió itt található).

Először hozzá kell adnia a pom.xml:

 com.codepoetics protonpack 1.13 

Most nézzük meg a kódot:

nyilvános lista getEvenIndexedStrings (Lista nevek) {Lista list = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); visszatérési lista; }

A következő teszteli ezt a módszert és sikeresen teljesíti:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {List names = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); Lista Várható eredmény = Tömbök.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); Lista actualResult = StreamIndices.getEvenIndexedStrings (nevek); assertEquals (várható eredmény, tényleges eredmény); }

4. Használata StreamEx

Indexekkel is iterálhatunk a filterKeyValue () nak,-nek EntryStream osztály tól StreamEx könyvtár (a legfrissebb verzió itt található). Először hozzá kell adnunk a sajátunkhoz pom.xml:

 egy.util streamex 0.6.5 

Nézzük meg a módszer egyszerű alkalmazását az előző példánk segítségével:

nyilvános lista getEvenIndexedStringsVersionTwo (Lista nevek) {return EntryStream.of (nevek) .filterKeyValue ((index, név) -> index% 2 == 0) .values ​​() .toList (); }

Hasonló tesztet fogunk használni ennek tesztelésére:

@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List várhatóResult = Arrays.asList ("Afrim", "Besim", "Durim"); Sorolja fel a actualResult = StreamIndices.getEvenIndexedStrings (neveket); assertEquals (várható eredmény, tényleges eredmény); }

5. Iteráció használata Vavre’S Folyam

Az iteráció másik elfogadható módja a használat zipWithIndex () a metódusa Vavr (korábban Javaslang) Folyam végrehajtás:

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

Ezt a példát a következő módszerrel tesztelhetjük:

@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List várhatóResult = Arrays.asList ("Bashkim", "Lulzim", "Shpetim"); Sorolja fel a actualResult = StreamIndices.getOddIndexedStringsVersionTwo (neveket); assertEquals (várható eredmény, tényleges eredmény); }

Ha többet szeretne megtudni a Vavr-ról, nézze meg ezt a cikket.

6. Következtetés

Ebben a gyors bemutatóban négy megközelítést láthattunk arról, hogyan lehet iterálni a folyamokon indexek segítségével. A folyamatok sok figyelmet kaptak, és hasznos lehet, ha indexekkel is tudunk iterálni rajtuk.

Nagyon sok olyan funkció található, amelyet a Java 8 Stream tartalmaz, amelyek közül néhányat a Baeldung már lefed.

Az itt ismertetett összes példának a kódja, és még sok más megtalálható a GitHubon.


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