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.