Java 8 erweitert für Schleife mit Index / Bereich


8

Ist es möglich, einen Index / Bereich in einer erweiterten for-Schleife in Java anzugeben?

Zum Beispiel habe ich eine Liste: List<String> list;

Und ich möchte eine for-Schleife von Index 1 anstelle von 0 ausführen:

for(String s : list(start from index 1))

ODER bis Index 5

for(String s : list(end at index 5))

Ich weiß, dass ich die traditionelle for-Schleife verwenden oder einen Zähler in der erweiterten for-Schleife behalten kann, aber ich wollte wissen, ob in Java- oder Apache-Sammlungen etwas von der Stange ist.

Antworten:


19

Ich würde subListin diesem Fall verwenden:

for(String s : list.subList(1, list.size()))

und

for(String s : list.subList(0, 6))

11

Die Verwendung von sublistist besser, aber die Stream-Version verwendet skipund limit:

list.stream().skip(1) .... limit(6)..... 

7

In Java 8 haben wir die Stream-API, mit der wir List mit benutzerdefinierten Indizes durchlaufen können:

List<String> evenIndexes = IntStream
  .range(0, names.length)
  .filter(i -> i % 2 == 0)
  .mapToObj(i -> names[i])
  .collect(Collectors.toList());

In der rangeMethode können Sie von 1 beginnen und / oder bis 5 iterieren.


5

Die traditionelle for-Schleife ist die "out of the box" -Lösung für diese Anforderung:

for (int i = 1; i < list.size(); i++) {
    String s = list.get(i);
    ...
}

und (wenn der Listmindestens 5 Elemente hat):

for (int i = 0; i < 5; i++) {
    String s = list.get(i);
    ...
}

2

Ich bin mir der Leistungsstrafe nicht sicher, aber Sie können verwenden List::subList

List<String> list = Arrays.asList("a", "b", "c");

for (String s : list.subList(1, list.size())) {
        System.out.println(s);
}

Ausgabe

2
3

2
Du brauchst nicht new String []; du kannst einfach schreiben Arrays.asList("a", "b", "c"). Da subListkeine Elemente kopiert werden, ist der Leistungsverlust, falls vorhanden, vernachlässigbar.
Holger

0

Es ist möglich mit list.subList(1, list.size()) , aber es wird Leistungseinbußen für die Unterlistenliste hinzufügen. In diesem Fall ist es besser, die traditionelle for-Schleife zu verwenden.

// Berechnen Sie zuerst die Größe, um Leistungseinbußen zu vermeiden, die bei jeder Iteration in einer Schleife berechnet werden

int size = list.size();

for (int i = 1; i < size; i++) {
    String s = list.get(i);
    ...
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.