0

for each loops are a nice syntactic abbreviation to iterate over all elements in a List:

for (Object object : list) {
  // do something with the object
}

However, when I also need the index of the element being processed in each iteration, I have to 'fall back' to the old style:

for (int i = 0; i < list.size(); i++) {
  Object object = list.get(i);
  // do something with the object and its index
}

Also, if the list is not a random-access one (for example a LinkedList), to avoid quadratic complexity of iteration I would have to write something like:

int i = 0;
for (Object object : list) {
  // do something with the object and its index
  i++;
}

Is there any more convenient form to get the element and its index in each iteration (maybe Java 8 streams API combined with some short lambdas)?

The best approach I've been able to come up to so far is to create my custom reusable functional interface:

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

Then I can iterate the collection the following way:

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);
        });
    }
}
Dragan Bozanovic
  • 23,102
  • 5
  • 43
  • 110

0 Answers0