Thank you for your informative response. What you describe sounds very promising. (I hope the extra parentheses will not be required, though.)
I take it that by “no runtime cost” you mean that something like the following would do only one heap allocation (for the iterator)? T[] array; for (int index, T element : Arrays.indexedElements(array)) { ... } Map.entrySet() is not a good test of performance since the Entry objects already exist and are returned without copying. Alan > On Jan 1, 2019, at 11:16 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > ----- Mail original ----- >> De: "Alan Snyder" <javali...@cbfiddle.com> >> À: "Brian Goetz" <brian.go...@oracle.com> >> Cc: "core-libs-dev" <core-libs-dev@openjdk.java.net> >> Envoyé: Vendredi 21 Décembre 2018 03:19:14 >> Objet: Re: enhanced for loop with multiple iteration variables > >> RIght, but I don’t see that as a general solution. >> >> Its also a bit kludgy, like saying that methods need only one parameter >> because >> you can always pass a data object. > > yes, that's the point, as part of Valhalla, we want to introduce value types > in Java. > A value type is an almost zero cost abstraction that let you group and > ungroup values. > > Also as part of Amber, we want to be able to de-construct record types > (product types) in order to support pattern matching. > > If we have value types and de-construction, we are not far be able to write > something like: > for((var key, var value): map.entrySet()) { > // ... > } > with no runtime cost. > > So being able to use the enhanced for loop on tuples is clearly something we > want to have, but to achieve that goal i don't think that introducing a new > Iterator2 interface is the right way to do that. > > regards, > Rémi > > >> >>> On Dec 20, 2018, at 2:50 PM, Brian Goetz <brian.go...@oracle.com> wrote: >>> >>> For Map, you can do: >>> >>> for (Map.Entry<K,V> e : map.entrySet()) { ... } >>> >>> and you're already there. >>> >>> >>> >>> On 12/19/2018 9:54 AM, Alan Snyder wrote: >>>> Has any consideration been given to supporting iterators that provide more >>>> than >>>> one iteration variable in the enhanced for loop? >>>> >>>> Obvious uses would be maps (keys and values) and lists (indexes and >>>> values). >>>> >>>> I have in mind keeping the syntactic sugar approach by using one or more >>>> extensions of the Iterator/Iterable interfaces, such as, for example: >>>> >>>> interface Iterator2<E1,E2> extends Iterator<E1> { >>>> E2 get2(); >>>> } >>>> >>>> with the extra methods providing the values for the extra variables >>>> (associated >>>> with the previous call to next). >>>> >>>> Extending interfaces is not required, but it makes the trailing variables >>>> optional, which might be useful. For example, the same iterator could >>>> provide >>>> values or values and keys. >>>> >>>> The fact that this approach only works for a fixed set of numbers of >>>> variables >>>> does not bother me unduly. >>>> >>>> Alan >>>> >