Präzise indexbasierte Stream-Iteration in Java 8
Viele Programmieraufgaben umfassen das Durchlaufen einer Datenstruktur und gleichzeitigen Zugriff auf den entsprechenden Index. Java 8-Streams bieten eine breite Palette von Operationen für die Stream-Verarbeitung, es gibt jedoch keine explizite Möglichkeit, den Index während der Iteration abzurufen.
Der bereitgestellte Java-Code zeigt einen ziemlich ausführlichen Ansatz mit IntStream, boxed(), zip( ), filter(), map() und Collect(). Während es das gewünschte Ergebnis erzielt, beeinträchtigen seine Länge und Komplexität seine Eleganz.
Sauberste Methode:
Der prägnanteste Ansatz besteht darin, von einem Strom von Indizes auszugehen:
String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"}; IntStream.range(0, names.length) .filter(i -> names[i].length() <= i) .mapToObj(i -> names[i]) .collect(Collectors.toList());
Diese Methode erstellt einen Strom von Indizes von 0 bis zur Länge des Arrays und filtert die Indizes basierend auf der Länge des entsprechenden Arrays string, ordnet die Indizes den entsprechenden Strings zu und sammelt die Ergebnisse in einer Liste.
Alternative Methode:
Eine andere Möglichkeit besteht darin, einen Ad-hoc-Indexzähler zu verwalten ein veränderliches Objekt wie ein AtomicInteger:
String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"}; AtomicInteger index = new AtomicInteger(); List<String> list = Arrays.stream(names) .filter(n -> n.length() <= index.incrementAndGet()) .collect(Collectors.toList());
Diese Methode bewahrt die Vertrautheit der For-Schleifen-basierten Indexerhöhung. Es ist jedoch zu beachten, dass die Verwendung dieser Methode in einem parallelen Stream aufgrund der nicht deterministischen Reihenfolge der Parallelverarbeitung möglicherweise zu fehlerhaftem Verhalten führen kann.
Das obige ist der detaillierte Inhalt vonWie kann ich einen Java 8-Stream mit Indexzugriff effizient durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!