Stream constructors for stream(Iterator) in StreamSupport?

Brian Goetz brian.goetz at oracle.com
Sat Apr 13 15:02:55 PDT 2013


I think Tim's concern is that he recognizes two categories of potential 
users:

  - Library writers who want to expose a stream() method but are not 
ready to take the plunge to Spliterator;
  - Poor users who want a stream and all they can get out of their damn 
library is an Iterator.

The question is, is there a way to not hose the second category without 
making things worse?

On 4/13/2013 5:32 PM, Joe Bowbeer wrote:
> I think the signature fits better in support. (The default method
> alternative negates this.) However another argument is based on the
> expected users. If they are not library writers then it should not go in
> the support class.
>
> On Apr 13, 2013 2:15 PM, "Brian Goetz" <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
>         That's a great taxonomy of ways to make a stream, but the
>         division of
>         static factory methods into Streams and StreamSupport wasn't, as I
>         understood it, along those lines. It was about keeping concepts that
>         most users aren't going to want to mess with (i.e., Spliterator)
>         out of
>         their line of sight.
>
>
>     That was indeed part of it.  But the other part of it was guiding
>     them away from low-level tools they might mistakenly (mis)use
>     because we'd not sufficiently labeled things into bins of "for
>     users" and "for library writers."  I still think
>     stream-from-iterator is low-level, because it involves choosing
>     things like stream flags (and doing it wrong will have bad results.)
>
>         If all you have is an Iterator, you don't want have to go down
>         into the
>         basement to get something that turns it into a Stream. Put those
>         tradeoffs on the packaging but leave the package in the kitchen.
>
>
>     So, the tension here is:
>       - helping the poor users for whom all they can get is an Iterator,
>     and they want a stream;
>       - avoiding the moral hazard of encouraging people to think that
>     Iterator is actually a *good* way to make a stream (which might even
>     encourage them to write more Iterators!)  I want them to think is
>     "Iterator is the last possible resort for making a stream, including
>     a number of resorts that I should learn about first before writing
>     an Iterator."
>
>     The current status quo is either better or worse in this, depending
>     on which of the two above forces you are more compelled by.  The way
>     to make a Stream from an iterator currently is:
>
>        Streams.stream(Spliterators.__spliteratorUnknownSize(__iterator,
>     flags));
>        Streams.stream(Spliterators.__spliterator(iterator, size, flags));
>
>     Which do the job but suffer from poor discoverability.  On the other
>     hand, it has none of the moral hazard -- its pretty clear you're
>     nailing bags on bags, and I don't think this status quo is so awful.
>
>
>     Another direction (as discussed previously without convergence)
>     would be to augment Iterable with a stream() method.  This helps
>     users of non-Collection Iterable classes, but still has some of the
>     moral hazard as it does not put enough pressure on writers of
>     Iterable classes to write better stream() implementations.
>


More information about the lambda-libs-spec-experts mailing list