Java 8 aprimorado para loop com índice / intervalo

8

É possível especificar um índice / intervalo no loop for aprimorado em Java?

Por exemplo, eu tenho uma lista: List<String> list;

E eu quero executar um loop for do índice 1 em vez de 0:

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

OU até o índice 5

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

Eu sei que posso usar o loop for tradicional ou manter um contador dentro do loop for aprimorado, mas eu queria saber se há algo fora da caixa nas coleções Java ou apache?

tentando aprender
fonte

Respostas:

19

Eu usaria subListneste caso:

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

e

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

Usar of sublisté melhor, mas a versão do stream está usando skipe limit:

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

No Java 8, temos a API Stream, que podemos usar para iterar sobre List com índices personalizados:

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

no rangemétodo, você pode começar de 1 e / ou iterar para 5.

BSeitkazin
fonte
5

O loop for tradicional é a solução "pronta para uso" para este requisito:

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

e (se Listtiver pelo menos 5 elementos):

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

Não tenho certeza da penalidade de desempenho, mas você pode usar List::subList

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

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

resultado

2
3
Wombat assustador
fonte
2
Você não precisa new String []; você pode simplesmente escrever Arrays.asList("a", "b", "c"). Como subListnão copia elementos, a penalidade de desempenho é insignificante, se houver.
Holger
0

É possível com list.subList(1, list.size()), mas adicionará uma penalidade de desempenho à lista de sub-listas. É melhor usar o laço for tradicional neste caso.

// Calcule primeiro o tamanho para evitar o cálculo da penalidade de desempenho em loop a cada iteração

int size = list.size();

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