Java-stream-filter-Elemente eines bestimmten index
Ich bin auf der Suche nach einer prägnanten Art und Weise heraus zu filtern Elemente einer Liste an einem bestimmten index. Mein Beispiel Eingabe sieht wie folgt aus:
List<Double> originalList = Arrays.asList(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
List<Integer> filterIndexes = Arrays.asList(2, 4, 6, 8);
Ich will heraus zu filtern Elemente mit index 2
, 4
, 6
, 8
. Ich habe eine for-Schleife überspringt Artikel, die mit dem index, aber ich hatte gehofft, es wäre eine einfache Möglichkeit, es zu tun mit streams. Das Endergebnis würde dann so Aussehen:
List<Double> filteredList = Arrays.asList(0.0, 1.0, 3.0, 5.0, 7.0, 9.0, 10.0);
- Dies ist unglaublich einfach, mit einem
for
Schleife undremove(int)
. Nicht verwenden streams für alles. - Danke @PaulBoddington. Aus .NET Arbeit bin ich auf das verwenden von LINQ für die meisten array/Liste der Operationen, und es ist leicht, dies zu tun ist die Verwendung von LINQ so war in der Hoffnung, etwas ähnliches wäre in Java 8 streams
- Streams und jede Art der Indizierung nicht gut auskommen überhaupt.
- Diese expliziten array-Erstellung Aussagen wie
new Double[] {…}
undnew Integer[] {…}
veraltet sind. Nur verwenden, z.B.List<Integer> filterIndexes = Arrays.asList(2, 4, 6, 8);
- Ich geschrieben eine Antwort, indem sowohl,
remove(int)
und Bäche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erzeugen eine
IntStream
zu imitieren, die Indizes der ursprünglichen Liste, entfernen Sie dann die diejenigen, die in derfilteredIndexes
Liste und ordnen Sie dann diese Indizes, um Ihre entsprechende element in der Liste (ein besserer Weg wäre, um eineHashSet<Integer>
für Indizes, da Sie einzigartig sind, per definition, so dasscontains
ist eine Konstante Betriebszeit).Wenn Ihr
filteredIndexes
Liste ist vorsortiert, können Sie vermeiden, überprüfen Sie jedes element in dieser Art:Hier erstellen wir eine Anzahl von Teillisten enthalten alle Elemente, die zwischen den gefilterten Indizes, dann eben glätten Sie in der einzigen final-Liste. Für große Eingaben (z.B. eine million von zahlen) dieser Lösung könnte sein, Größenordnungen schneller, als man vorgeschlagen von @AlexisC.
Wenn Sie Sortieren Ihre Indizes absteigend, dann können Sie
java.util.List.remove(int)
um die Elemente zu entfernen..mapToInt(Integer::valueOf)
. Das funktioniert, aber Sie konvertieren dasInteger
Objekt zu einemint
Wert zu übergebenInteger valueOf(int)
wieder einInteger
- Objekt, das dann automatisch ohne Verpackung zu einemint
wie Sie mit HilfemapToInt
. Sie sicherlich wollen Sie entweder.mapToInt(i->i)
oder.mapToInt(Integer::intValue)
, die Durchführung einer einzigen unboxing, statt.Integer::intValue
was ich suchte. Ich habe auch versuchtFunction.identity()
aber das hat nicht funktioniert.Function.identity()
gibt eineFunction
eher als eineToIntFunction
, so dass nicht funktioniert, als die herkömmliche Art Kompatibilitäts-Regeln gelten hier eher als funktionale Signatur-matching wie bei der Verwendungx -> x
direkt...