Ako iterovať v toku pomocou indexov

1. Prehľad

Java 8 Prúdy nie sú kolekciami a k ​​prvkom nie je možné pristupovať pomocou ich indexov, ale stále existuje niekoľko trikov, ako to umožniť.

V tomto krátkom článku sa pozrieme na to, ako iterovať cez a Prúd použitím IntStream, StreamUtils, EntryStream, a Vavr‘S Prúd.

2. Používanie obyčajnej Javy

Môžeme prechádzať a Prúd pomocou Celé číslo rozsahu a tiež ťažiť zo skutočnosti, že pôvodné prvky sú v poli alebo kolekcii prístupnej pomocou indexov.

Implementujme metódu, ktorá iteruje s indexmi a demonštruje tento prístup.

Jednoducho povedané, chceme získať celý rad Struny a vyberte iba rovnomerne indexované prvky:

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

Poďme teraz vyskúšať implementáciu:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Zoznam očakávaných výsledkov = Arrays.asList ("Afrim", "Besim", "Durim"); Zoznam actualResult = StreamIndices.getEvenIndexedStrings (názvy); assertEquals (expectResult, actualResult); }

3. Používanie StreamUtils

Ďalším spôsobom iterácie s indexmi je možné vykonať pomocou príkazu zipWithIndex () metóda StreamUtils z protónové balenie knižnica (najnovšiu verziu nájdete tu).

Najskôr si ho musíte pridať do svojho pom.xml:

 com.codepoetics protonpack 1.13 

Teraz sa pozrime na kód:

verejný zoznam getEvenIndexedStrings (názvy názvov) {zoznam list = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); návratový zoznam; }

Nasledujúce testuje túto metódu a úspešne prechádza:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {List names = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); Zoznam expectResult = Arrays.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); Zoznam actualResult = StreamIndices.getEvenIndexedStrings (názvy); assertEquals (expectResult, actualResult); }

4. Používanie StreamEx

Môžeme tiež iterovať pomocou indexov pomocou filterKeyValue () z EntryStream trieda z StreamEx knižnica (najnovšiu verziu nájdete tu). Najprv to musíme pridať do našej pom.xml:

 one.util streamex 0,6,5 

Pozrime sa na jednoduché použitie tejto metódy pomocou nášho predchádzajúceho príkladu:

public List getEvenIndexedStringsVersionTwo (zoznam názvov) {návrat EntryStream.of (názvy) .filterKeyValue ((index, názov) -> index% 2 == 0) .values ​​() .toList (); }

Na testovanie použijeme podobný test:

@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Zoznam očakávaných výsledkov = Arrays.asList ("Afrim", "Besim", "Durim"); Zoznam actualResult = StreamIndices.getEvenIndexedStrings (názvy); assertEquals (expectResult, actualResult); }

5. Iterácia pomocou Vavre‘S Prúd

Ďalším pravdepodobným spôsobom iterácie je použitie zipWithIndex () metóda Vavr (predtým známy ako Javaslang) 's Prúd implementácia:

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

Tento príklad môžeme vyskúšať nasledujúcou metódou:

@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Zoznam očakávaných výsledkov = Arrays.asList ("Bashkim", "Lulzim", "Shpetim"); Zoznam actualResult = StreamIndices.getOddIndexedStringsVersionTwo (názvy); assertEquals (expectResult, actualResult); }

Ak sa chcete o Vavre dozvedieť viac, prečítajte si tento článok.

6. Záver

V tomto rýchlom výučbe sme videli štyri prístupy k tomu, ako iterovať v prúdoch pomocou indexov. Potoky si získali veľkú pozornosť a môže im pomôcť schopnosť iterácie s nimi aj pomocou indexov.

Streamovanie Java 8 obsahuje množstvo funkcií, z ktorých niektoré sú už obsiahnuté v Baeldungu.

Kód všetkých príkladov tu vysvetlených a oveľa viac nájdete na GitHub.


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