Shortcuts on Collections to create Streams

Brian Goetz brian.goetz at oracle.com
Thu Mar 4 18:54:10 UTC 2021


We are extremely conservative about adding "convenience" methods; in 
general, they don't carry their weight.  There are exceptions, but these 
have to be justified carefully.

Your original mail illustrates one of the many problems with convenience 
methods: every one we add leads to a call for more:

>   As Collection already has a default implementation for 'forEach', I'm
> wondering why there is no similar shortcuts for a couple of repeating
> patterns around the Collection <--> Stream transitions?

But a world with the union of all possible convenience methods that 
someone could imagine being useful, is not the world we want to live in; 
both library implementors and users would be overwhelmed with trivial 
differences, and this crowds out higher-value activities. In general, we 
prefer to expose the primitives, and let users combine them, though 
different JDK libraries follow this to different degrees.  But, in 
general, a "trivial" method requires a nontrivial amount of justification.

On 3/4/2021 1:56 AM, Zs. wrote:
> Thanks, so I'm late by about 4 months for that method.
> I've found the tickets about this for future reference:
> https://bugs.openjdk.java.net/browse/JDK-8180352
> and the pull request - https://github.com/openjdk/jdk/pull/1026
> Now, I only miss the 3 other what I've mentioned :)
>
> Best regards,
>   Zsombor
>
> On Wed, Mar 3, 2021 at 10:53 PM Thiago Henrique Hupner <thihup at gmail.com>
> wrote:
>
>> They have added the Stream#toList in JDK 16:
>> https://download.java.net/java/early_access/jdk16/docs/api/java.base/java/util/stream/Stream.html#toList()
>>
>>
>> Em qua., 3 de mar. de 2021 às 18:45, Zs. <gzsombor at gmail.com> escreveu:
>>
>>> Hi,
>>>
>>>   As Collection already has a default implementation for 'forEach', I'm
>>> wondering why there is no similar shortcuts for a couple of repeating
>>> patterns around the Collection <--> Stream transitions?
>>> For example, if you could write:
>>>   collection.map(...) instead of collection.stream().map(...);
>>>   collection.filter(...) instead of collection.stream().filter(...);
>>> Or for the other direction:
>>>   stream.toList() instead of stream.collect(Collectors.toList())
>>>   stream.toSet() instead of stream.collect(Collectors.toSet())
>>>
>>> They are heavily used even in OpenJDK's source code:
>>>
>>>     -
>>>
>>> https://github.com/search?q=stream%5C%28%5C%29.filter%28+repo%3Aopenjdk%2Fjdk+language%3AJava&type=Code&ref=advsearch&l=Java&l=
>>>     -  380 results, unfortunately with false matches from javax.xml.stream.
>>>        StreamFilter
>>>     -
>>>
>>> https://github.com/search?q=stream%5C%28%5C%29.map%5C%28%5C%29+repo%3Aopenjdk%2Fjdk&type=Code
>>>        - 559 results, unfortunately with false matches from comments or
>>>        streams().mapToInt or not related code
>>>
>>>
>>>     -
>>>
>>> https://github.com/openjdk/jdk/search?q=collect%28Collectors.toList%28%29%29
>>>     -  367 results
>>>     -
>>>
>>> https://github.com/openjdk/jdk/search?q=collect%28Collectors.toSet%28%29%29
>>>     -  117 results
>>>
>>> Any particular reason, why adding these - 4 or more - default method to a
>>> collection deemed unnecessary or harmful? Unfortunately I haven't been
>>> able
>>> to find the answers for this question using internet searches.
>>>
>>> Thanks,
>>>   Zsombor
>>>



More information about the jdk-dev mailing list