On Apr 28, 2015, at 10:22 AM, Kasper Nielsen <kaspe...@gmail.com> wrote:
> On Tue, Apr 28, 2015 at 9:16 AM, Paul Sandoz <paul.san...@oracle.com> wrote: > On Apr 27, 2015, at 10:34 PM, Kasper Nielsen <kaspe...@gmail.com> wrote: > > The other default function I would like to see is stream.toList() (I can > > live with collectToList) which is short for s.collect(Collectors.toList()). > > 50 % of my terminal functions are s.collect(Collectors.toList()). > > Can you live with a static import and: > > s.collect(toList()) > > ? which is rather close to "collectToList". > > When designing j.u,s.Stream we made a conscious decision to not bind it to > j.u collection types. A Stream could be integrated with other forms of > collections (e.g. GS Collections). > > First, if you are using any kind of modern IDE you have some kind of > intelligent completion which will suggest collectToList the moment you press > the 'c' in stream.c... > The other one you have to create an additional import, and invoke a static > method (Yes I know most IDEs makes this easy as well) > But we are still talking about something like 1 second vs 5 seconds. > Not much in it then :-) perhaps IDEs might even be enhanced able to suggest collect(toList()) upfront? (After writing the above i saw your email with a link to IntelliJ Collector templates, neat!) > Second, s.collect(toList()) is just not naturally for most users. Sure > readers on this list understands how the collect method works. But I don't > think many novice/intermediate users will. > It's a trick that only has to be learnt once. > Third, Yes there are a lot of different collections that a stream can be > integrated with. But we are talking about roughly 50 % of the usage. > And then someone wants Set, then Map etc. etc. We are also designing Stream for the future where perhaps we might have alternative collection types (not committing to that... :-)) and then someone wants that list type etc. etc. > Fourth, this hasn't actually anything to do with ease of use but performance. Ah, so this is your actual motivation! masquerading in an ease-of-use disguise :-) You raise a good point about the current limitations of Collectors not being able to leverage more information of the pipeline, such as known size. > But I have a very fast stream implementation where I would like to provide a > fast (and easy) way to return the stream elements as a list. This is mainly > in situations where I know the number of elements in the result (which is > quite often if you don't use filters). By having a toList() method I can > implement, I can avoid the array list resizings in s.collect(toList()). > This is actually also why I would prefer if it was called toList() and not > collectToList() as I think it is implementation detail how the list > generation is done. > This does not mean we need to expose a Stream.toList. How about we improve Collectors instead? [*]. For parallel execution we need to work out how better to merge lists and maps. Propagating size information at the root and for each leaf is important for pre-sizing. We can use growable arrays to avoid resizing. -- Separately, the best way to expose a mechanism where you want to do your own stuff is to provide an operation SPI. We are just not ready to do that for 9 given what post 9 will bring. Paul. [*] We could of course take advantage of internal details, that might be a reasonable short-cut for 9, but it would be nice to solve this via a public API.