Java 8 mejorado para bucle con índice / rango

8

¿Es posible especificar un índice / rango en bucle mejorado para Java?

Por ejemplo, tengo una lista: List<String> list;

Y quiero ejecutar un bucle for desde el índice 1 en lugar de 0:

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

O hasta el índice 5

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

Sé que puedo usar el bucle for tradicional o mantener un contador dentro del bucle for mejorado, pero quería saber si hay algo fuera de la caja en las colecciones de Java o Apache.

tratando de aprender
fuente

Respuestas:

19

Yo usaría subListen este caso:

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

y

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

El uso de sublistes mejor, pero la versión de transmisión está usando skipy limit:

list.stream().skip(1) .... limit(6)..... 
Hadi J
fuente
7

En Java 8 tenemos Stream API, que podríamos usar para iterar sobre Lista con índices personalizados:

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

en el rangemétodo, puede comenzar desde 1 y / o iterar hasta 5.

BSeitkazin
fuente
5

El bucle for tradicional es la solución "lista para usar" para este requisito:

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

y (si Listtiene al menos 5 elementos):

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

No estoy seguro de la penalización de rendimiento, pero puedes usar List::subList

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

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

salida

2
3
Wombat aterrador
fuente
2
Usted no necesita new String []; simplemente puedes escribir Arrays.asList("a", "b", "c"). Como subListno copia elementos, la penalización de rendimiento es insignificante, si la hay.
Holger
0

Es posible con list.subList(1, list.size()), pero agregará una penalización de rendimiento para la lista de sublistación. Es mejor usar el bucle tradicional para en este caso.

// Calcule primero el tamaño para evitar la penalización de rendimiento calculando en ciclo cada iteración

int size = list.size();

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