So iterieren Sie über einen Stream mit Indizes

1. Übersicht

Java 8- Streams sind keine Sammlungen, und auf Elemente kann nicht über ihre Indizes zugegriffen werden. Es gibt jedoch noch einige Tricks, um dies zu ermöglichen.

In diesem kurzen Artikel werden wir sehen , wie ein iterieren - Stream mit IntStream, StreamUtils, EntryStream, und Vavr ‚s - Stream .

2. Verwenden von Plain Java

Wir können mit einem Integer- Bereich durch einen Stream navigieren und auch von der Tatsache profitieren, dass sich die ursprünglichen Elemente in einem Array oder einer Sammlung befinden, auf die Indizes zugreifen können.

Implementieren wir eine Methode, die mit Indizes iteriert und diesen Ansatz demonstriert.

Einfach ausgedrückt, wir möchten ein Array von Strings erhalten und nur gerade indizierte Elemente auswählen:

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; }

Testen wir nun die Implementierung:

@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. Verwenden von StreamUtils

Eine andere Möglichkeit, mit Indizes zu iterieren, besteht in der zipWithIndex () -Methode von StreamUtils aus der Proton-Pack- Bibliothek (die neueste Version finden Sie hier).

Zuerst müssen Sie es zu Ihrer pom.xml hinzufügen :

 com.codepoetics protonpack 1.13  

Schauen wir uns nun den Code an:

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

Folgendes testet diese Methode und besteht erfolgreich:

@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. Verwenden von StreamEx

Wir können auch mit indexKeyValue () der EntryStream- Klasse aus der StreamEx- Bibliothek mit Indizes iterieren (die neueste Version finden Sie hier). Zuerst müssen wir es unserer pom.xml hinzufügen :

 one.util streamex 0.6.5 

Sehen wir uns eine einfache Anwendung dieser Methode anhand unseres vorherigen Beispiels an:

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

Wir werden einen ähnlichen Test verwenden, um dies zu testen:

@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. Iteration Mit Vavre ‚s - Stream

Eine andere plausible Art der Iteration ist die Verwendung der zipWithIndex () -Methode der Stream- Implementierung von Vavr (früher bekannt als Javaslang ) :

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

Wir können dieses Beispiel mit der folgenden Methode testen:

@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); }

Wenn Sie mehr über Vavr erfahren möchten, lesen Sie diesen Artikel.

6. Fazit

In diesem kurzen Tutorial haben wir vier Ansätze zum Durchlaufen von Streams mithilfe von Indizes gesehen. Streams haben viel Aufmerksamkeit erhalten und es kann hilfreich sein, sie auch mit Indizes zu durchlaufen.

In Java 8 Streams sind viele Funktionen enthalten, von denen einige bereits in Baeldung behandelt werden.

Den Code für alle hier erläuterten Beispiele und vieles mehr finden Sie auf GitHub.