Stream constructors for stream(Iterator) in StreamSupport?
Jim Mayer
jim at pentastich.org
Sat Apr 13 19:08:40 PDT 2013
Hi Brian,
How about introducing a new method name, like "adapt", "asStream", or
"convert" that implies overhead?
Another possibility would be to introduce a new class, like
"StreamConverters" whose name, again, implies the additional overhead.
Jim
On Sat, Apr 13, 2013 at 6:02 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> 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-observers
mailing list