Exception handling vs. hasNext()
brendan at mozilla.org
Mon Nov 19 09:40:47 PST 2007
On Nov 19, 2007, at 7:51 AM, Garrett Smith wrote:
> So... I want to iterate over the keys in a Map.
Yuh-Ruey already replied, but I just wanted to point out that this:
for (let k in map.iterator::getKeys())
can be done simply via:
for (let k in map)
because the Map class provides the key iterator that its
iterator::getKeys method returns from its default iterator::get
method (which for-in calls) too. That is, by default, Map iteration
If you want values or items (key/value pairs), you can get those too.
To iterate over values, you might use:
for (let v in map.iterator::getValues())
but you should rather use the more succinct for-each-in loop:
for each (let v in map)
To iterate over items, use:
for (let [k, v] in map.iterator::getItems())
This item iteration case has no more concise form analogous to for-
each-in, because if ES4 were always to map:
for (let [k, v] in map) ...
for (let [k, v] in map.iterator::getItems()) ...
it would wrongly preempt destructuring of arbitrary properties from
the value returned by the default iterator (the object returned by
map.iterator::get()) -- it would prevent writing:
for (let [s, v, o] in tripledb) ...
where tripledb.iterator::get() returns an iterator over [subject,
verb, object] triples.
If you feel the need to use a Java-like hasMore/getNext pattern, just
lie down till the feeling goes away ;-). The Pythonic iteration
protocol is simpler to use, more efficient to implement, and has no
unchecked inconsistent state possibilities between hasMore and
getNext. And yes, leveraging Python here is good reuse of language
design, implementation experience, and user knowledge.
You do not need to catch StopIteration in any common cases. So don't
fret about the fact that there's an exception thrown under the hood.
Exceptions are not all errors.
More information about the Es4-discuss