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?

Respostas:


19

Eu usaria subListneste caso:

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

e

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

11

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

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

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.


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);
    ...
}

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

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);
    ...
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.