Hello, Remi! It actually works thanks to auto-boxing/unboxing. E.g. this implementation works:
static Iterable<Integer> range(int from, int to) { return () -> new PrimitiveIterator.OfInt() { int cur = from; @Override public int nextInt() { if (cur >= to) { throw new NoSuchElementException(); } return cur++; } @Override public boolean hasNext() { return cur < to; } }; } public static void main(String[] args) { for(int i : range(0, 100)) { System.out.println(i); } } It correctly compiles and prints numbers from 0 to 99. As IntStream extends BaseStream<Integer, IntStream> and BaseStream<T, S extends BaseStream<T, S>> defines Iterator<T> iterator(), it would be no problem with using IntStream.range in such code pattern were BaseStream extends IterableOnce<T>. Of course this produces unnecessary garbage, as I said. With best regards, Tagir Valeev. On Wed, Mar 6, 2019 at 7:37 PM Remi Forax <fo...@univ-mlv.fr> wrote: > > Hi Tagir, > try to do it now and you will see that you can't, because you can not write > Iterable<int> yet. > Once we will get generics over value types, it will be a no-brainer. > > Rémi > > ----- Mail original ----- > > De: "Tagir Valeev" <amae...@gmail.com> > > À: "Stuart Marks" <stuart.ma...@oracle.com> > > Cc: "core-libs-dev" <core-libs-dev@openjdk.java.net> > > Envoyé: Mercredi 6 Mars 2019 11:10:41 > > Objet: Re: Proposal: JDK-8148917 Enhanced-For Statement Should Allow Streams > > > Hello! > > > > By the way one of the painful code patterns in modern Java is `for(int > > i = 0; i<bound; i++)` which is very verbose, hackish, confusing for > > newbies and prone to errors as the variable need to be repeated three > > times. Also the variable is not effectively final, despite it never > > changes within the loop body, so could have been considered as > > redeclared on every loop iteration (like in for-each). With the new > > proposal it's possible to write `for(int i : range(0, bound).boxed())` > > (assuming import static j.u.s.IntStream.range), which looks much > > better, though it has obvious performance drawback. Moving > > IterableOnce to BaseStream would enable to use `for(int i : range(0, > > bound))` which looks even better, though again we have plenty of > > garbage (but considerably less than in previous case!). I wonder > > whether Java could evolve to the point where such kind of code would > > be a recommended way to iterate over subsequent integer values without > > any performance handicap. > > > > With best regards, > > Tagir Valeev. > > > > On Fri, Mar 1, 2019 at 9:47 AM Stuart Marks <stuart.ma...@oracle.com> wrote: > >> > >> Hi all, > >> > >> Please review and comment on this proposal to allow Stream instances to be > >> used > >> in enhanced-for ("for-each") loops. > >> > >> Abstract > >> > >> Occasionally it's useful to iterate a Stream using a conventional loop. > >> However, > >> the Stream interface doesn't implement Iterable, and therefore streams > >> cannot be > >> used with the enhanced-for statement. This is a proposal to remedy that > >> situation by introducing a new interface IterableOnce that is a subtype of > >> Iterable, and then retrofitting the Stream interface to implement it. > >> Other JDK > >> classes will also be retrofitted to implement IterableOnce. > >> > >> Full Proposal: > >> > >> http://cr.openjdk.java.net/~smarks/reviews/8148917/IterableOnce0.html > >> > >> Bug report: > >> > >> https://bugs.openjdk.java.net/browse/JDK-8148917 > >> > >> Webrev: > >> > >> http://cr.openjdk.java.net/~smarks/reviews/8148917/webrev.0/ > >> > >> Note, this changeset isn't ready to push yet. In particular, it has no > >> tests > >> yet. However, the implementation is so simple that I figured I should > >> include > >> it. Comments on the specification wording are also welcome. > >> > >> Thanks, > >> > > > s'marks