for each
循环是一个很好的语法缩写,用于迭代List
中的所有元素:
for (Object object : list) {
// do something with the object
}
然而,当我还需要在每次迭代中处理的元素的索引时,我必须“退回”。旧样式:
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
// do something with the object and its index
}
此外,如果列表不是随机访问列表(例如LinkedList
),为避免迭代的二次复杂性,我必须编写如下内容:
int i = 0;
for (Object object : list) {
// do something with the object and its index
i++;
}
在每次迭代中是否有更方便的形式来获取元素及其索引(可能是Java 8流API和一些短lambda)?
到目前为止,我能够达到的最佳方法是创建自定义的可重用功能界面:
@FunctionalInterface
public interface WithIndex<T> {
void accept(int i, T t);
public static <T> void forEach(Collection<T> collection, WithIndex<T> consumer) {
int i = 0;
for (T t : collection) {
consumer.accept(i++, t);
}
}
}
然后我可以通过以下方式迭代集合:
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c");
WithIndex.forEach(list, (i, word) -> {
System.out.println("index=" + i + ", element=" + word);
});
}
}