if I do this in Java:
for(String s : myCollection.expensiveListGeneration()) { doSomething(); }
is expensiveListGeneration() invoked
It's invoked once, and not implementation dependant. The for-each loop is based on the Iterable interface. All it does is call the collection's iterator() method once at the beginning, and then works with that iterator.
iterator()