Java 8 增强 for 循环 index/range

Java 8 enhanced for loop with index/range

是否可以在 Java 中的增强 for 循环中指定一个 index/range?

例如我有一个列表:List<String> list;

我想 运行 从索引 1 而不是 0 开始的 for 循环:

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

OR 直到索引 5

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

我知道我可以使用传统的 for 循环或在增强的 for 循环中保留一个计数器,但我想知道 Java 或 apache 集合中是否有开箱即用的东西?

传统的for循环是针对这个需求的"out of the box"解决方案:

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

和(如果 List 至少有 5 个元素):

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

在这种情况下我会使用 subList

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

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

我不确定性能损失,但你可以使用 List::subList

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

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

输出

2
3

在 Java 8 中,我们有 Stream API,我们可以使用它来迭代具有自定义索引的 List:

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

range方法中,可以从1开始,and/or迭代到5。

使用 sublist 更好,但流版本使用 skiplimit

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

可以使用 list.subList(1, list.size()) ,但它会增加子列表的性能损失。在这种情况下最好使用传统的for循环。

//先计算大小以避免每次迭代在循环中计算性能损失

int size = list.size();

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