Cara Mengalir Aliran Dengan Indeks

1. Gambaran keseluruhan

Java 8 Streams bukan koleksi dan elemen tidak dapat diakses menggunakan indeksnya, tetapi masih ada beberapa trik untuk membuatnya dapat dilakukan.

Dalam artikel pendek ini, kita akan melihat bagaimana melakukan iterasi melalui Stream menggunakan IntStream, StreamUtils, EntryStream, dan Vavr 's Stream .

2. Menggunakan Java Plain

Kita dapat menavigasi melalui Aliran menggunakan rentang Integer , dan juga memanfaatkan fakta bahawa unsur-unsur aslinya ada dalam array atau koleksi yang dapat diakses oleh indeks.

Mari kita laksanakan kaedah yang berulang dengan indeks dan menunjukkan pendekatan ini.

Ringkasnya, kami ingin mendapatkan pelbagai String dan hanya memilih elemen yang diindeks genap:

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

Sekarang mari kita menguji pelaksanaannya:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }

3. Menggunakan StreamUtils

Cara lain untuk melakukan lelaran dengan indeks boleh dilakukan dengan menggunakan kaedah zipWithIndex () StreamUtils dari pustaka proton-pack (versi terbaru boleh didapati di sini).

Pertama, anda perlu menambahkannya ke pom.xml anda :

 com.codepoetics protonpack 1.13  

Sekarang, mari lihat kodnya:

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

Berikut ini menguji kaedah ini dan berjaya:

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

4. Menggunakan StreamEx

Kita juga boleh melelar dengan indeks menggunakan filterKeyValue () daripada EntryStream kelas dari StreamEx perpustakaan (versi terkini boleh didapati di sini). Pertama, kita perlu menambahkannya ke pom.xml kami :

 one.util streamex 0.6.5 

Mari lihat aplikasi mudah kaedah ini menggunakan contoh sebelumnya:

public List getEvenIndexedStringsVersionTwo(List names) { return EntryStream.of(names) .filterKeyValue((index, name) -> index % 2 == 0) .values() .toList(); }

Kami akan menggunakan ujian serupa untuk menguji ini:

@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }

5. Lelaran Menggunakan Vavre 's Stream

Kaedah lelaran lain yang masuk akal adalah menggunakan kaedah zipWithIndex () Vavr (sebelumnya dikenali sebagai Javaslang ) pelaksanaan Stream :

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

Kita boleh menguji contoh ini dengan kaedah berikut:

@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Bashkim", "Lulzim", "Shpetim"); List actualResult = StreamIndices.getOddIndexedStringsVersionTwo(names); assertEquals(expectedResult, actualResult); }

Sekiranya anda ingin membaca lebih lanjut mengenai Vavr, baca artikel ini.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami melihat empat pendekatan bagaimana melakukan lelaran melalui aliran menggunakan indeks. Aliran telah mendapat banyak perhatian dan dapat juga melaluinya dengan indeks dapat membantu.

Ada banyak fitur yang disertakan dalam Java 8 Streams, beberapa di antaranya sudah diliputi di Baeldung.

Kod untuk semua contoh yang dijelaskan di sini, dan banyak lagi boleh didapati di GitHub.