Proposal: JDK-8148917 Enhanced-For Statement Should Allow Streams

David Holmes david.holmes at oracle.com
Mon Mar 11 07:03:57 UTC 2019


On 7/03/2019 12:48 am, Scott Palmer wrote:
> I don’t mean any offence, but I have to say, I strongly disagree with nearly everything you’ve written below. To me, the idea of making a stream of integers for a simple loop counter is hackish, confusing, verbose, and basically abusing the stream concept.  The only part I agree with is that it is an obvious performance drawback as well.  A counter and a stream of integers are completely different concepts and should not be confused in this manner.

I totally agree! The stream variant is just obfuscation at its worst - 
cleverness for cleverness sake.

My 2c.

David

> Scott
> 
>> On Mar 6, 2019, at 5:10 AM, Tagir Valeev <amaembo at gmail.com> wrote:
>>
>> 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.marks at 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
> 


More information about the core-libs-dev mailing list