Kako prevrtati tok s indeksima

1. Pregled

Java 8 Potoci nisu zbirke i elementima se ne može pristupiti pomoću njihovih indeksa, ali ipak postoji nekoliko trikova koji će to omogućiti.

U ovom ćemo kratkom članku pogledati kako se iterirati preko a Stream koristeći IntStream, StreamUtils, EntryStream, i Vavr‘S Stream.

2. Korištenje obične Jave

Možemo se kretati kroz a Stream pomoću an Cijeli broj opsega, a također imaju koristi od činjenice da su izvorni elementi u nizu ili zbirci dostupnoj indeksima.

Primijenimo metodu koja se ponavlja s indeksima i demonstrira ovaj pristup.

Jednostavno rečeno, želimo dobiti niz Žice i odabiru samo parirane elemente:

javni popis getEvenIndexedStrings (string [] imena) {Popis evenIndexedNames = IntStream .range (0, names.length) .filter (i -> i% 2 == 0) .mapToObj (i -> imena [i]) .collect ( Collectors.toList ()); return evenIndexedNames; }

Isprobajmo sada implementaciju:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lista očekivanih rezultata = Arrays.asList ("Afrim", "Besim", "Durim"); Popis stvarnih rezultata = StreamIndices.getEvenIndexedStrings (imena); assertEquals (očekivani rezultat, stvarni rezultat); }

3. Korištenje StreamUtils

Drugi način ponavljanja indeksa može se izvršiti pomoću zipWithIndex () metoda StreamUtils od paket protona knjižnica (najnoviju verziju možete pronaći ovdje).

Prvo ga morate dodati u svoj pom.xml:

 com.codepoetics protonpack 1.13 

Pogledajmo sada kod:

javni Popis getEvenIndexedStrings (Imena popisa) {Popis list = StreamUtils .zipWithIndex (names.stream ()) .filter (i -> i.getIndex ()% 2 == 0) .collect (Collectors.toList ()); popis za povratak; }

Sljedeća testira ovu metodu i uspješno prolazi:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings () {Imena popisa = Arrays.asList ("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); Popis očekivani rezultat = Arrays.asList (Indexed.index (0, "Afrim"), Indexed.index (2, "Besim"), Indexed.index (4, "Durim")); Popis actualResult = StreamIndices.getEvenIndexedStrings (imena); assertEquals (očekivani rezultat, stvarni rezultat); }

4. Korištenje StreamEx

Također možemo ponavljati indekse pomoću filterKeyValue () od EntryStream razred iz StreamEx knjižnica (najnoviju verziju možete pronaći ovdje). Prvo, moramo ga dodati u naš pom.xml:

 one.util streamex 0.6.5 

Pogledajmo jednostavnu primjenu ove metode koristeći naš prethodni primjer:

javni popis getEvenIndexedStringsVersionTwo (imena popisa) {return EntryStream.of (imena) .filterKeyValue ((index, name) -> index% 2 == 0) .values ​​() .toList (); }

Za testiranje ćemo upotrijebiti sličan test:

@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lista očekivanih rezultata = Arrays.asList ("Afrim", "Besim", "Durim"); Popis stvarnih rezultata = StreamIndices.getEvenIndexedStrings (imena); assertEquals (očekivani rezultat, stvarni rezultat); }

5. Iteracija pomoću Vavre‘S Stream

Drugi vjerojatan način ponavljanja je upotreba zipWithIndex () metoda Vavr (prethodno poznat kao Javaslang) Stream provedba:

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

Ovaj primjer možemo testirati sljedećom metodom:

@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo () {String [] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; Lista očekivanih rezultata = Arrays.asList ("Bashkim", "Lulzim", "Shpetim"); Navesti stvarniResult = StreamIndices.getOddIndexedStringsVersionTwo (imena); assertEquals (očekivani rezultat, stvarni rezultat); }

Ako želite pročitati više o Vavru, pogledajte ovaj članak.

6. Zaključak

U ovom smo brzom vodiču vidjeli četiri pristupa kako itirirati kroz tokove koristeći indekse. Potoci su privukli puno pažnje, a mogućnost korisnog pregledavanja indeksa može biti od pomoći.

Puno je značajki uključenih u Java 8 Streams, od kojih su neke već pokrivene na Baeldungu.

Kôd za sve primjere ovdje objašnjene i još mnogo toga možete pronaći na GitHubu.


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