Additional Collectors

Brian Goetz brian.goetz at oracle.com
Wed Apr 3 11:31:52 PDT 2013


This should be handled by the two overloadings of toMap.  The general one:

   toMap(Function<T,U>, Supplier<M>, BinaryOperator<U>)

takes a merge function which resolves duplicates.

The default form:

   toMap(Function<T,U>)

implicitly uses a merge function which throws.  The doc says:

If the input elements contains duplicates
(according to {@link Object#equals(Object)}), an {@code 
IllegalStateException} is thrown when the
collection operation is performed.

for the basic form and documents the use of the merge function for the 
more general form.

Is that not adequate?

On 4/3/2013 2:21 PM, Ali Ebrahimi wrote:
> Hi brian,
> I have concerns about toMap method and this may result in unexpected and
> unpredictable results in user program, and this method only have mean
> for unique collections (Set) and streams (resulted for Stream.distinct).
> Consider this example:
>
> class Entity{
>       int id;   //key field
>       String name;
>   // override equals and hashcode
> ....
> }
>
> Entity foo = new Entity(1, "Foo");
> Entity bar = new Entity(1, "Bar");
> List<Entity> entities = list(new Entity(0, "Some"),foo,..., bar,...)
>
> Map<Entity,String> entitymap=entities.stream().collect(ToMap(e -> e.name
> <http://e.name>));
>
> what is result of entitymap.get(foo)? "Foo" or "Bar"
>
> Map<Entity,String> entitymap2=entities.parallelStream().collect(ToMap(e
> -> e.name <http://e.name>));
>
> what is result of entitymap2.get(foo)? "Foo" or "Bar"
>
> Suggestion1: get rid of ToMap
> Suggestion 2: May be we need consider adding subclass UniqueStream with
> additional method toMap and change return type of  Stream.distinct and
> Set.stream to UniqueStream.
>
> What do you think?
>
> Ali Ebrahimi
>
>
>
>
>
> On Wed, Apr 3, 2013 at 9:57 PM, Brian Goetz <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
>     There's been some feedback on lambda-dev and from the recent Lambda
>     Hack Day on Collectors.  There were two big categories:
>
>     1.  Need more / better docs.
>
>     2.  We want some more collectors.
>
>     The first is obvious and we've been working on those.  Here are some
>     suggestions for simple additions to the Collector set.
>
>       - count() (and possibly sum, min, max)
>
>     These are straighforward analogues of the specialized stream
>     methods; they serve as a "gentle on ramp"  to understanding reduction.
>
>     People also expressed concern that the "toMap()" (nee mappedTo,
>     joiningWith) is not flexible enough.  As a reminder, what toMap does
>     is take a Stream<T> and a function T->U and produces a Map<T,U>.
>       Some people call this "backwards"; they would rather have
>     something that takes a Stream<T> and function T->K and produces a
>     Map<K,T>.  And others would rather have something that takes two
>     functions T->K and T->U and produces a Map<K,U>.
>
>     All of these are useful enough.  The question is how to fit them
>     into the API.  I think the name "toMap" is a bit of a challenge,
>     since there are several "modes" and not all of them can be easily
>     handled by overloads.  Maybe:
>
>        toMap(T->U) // first version
>        toMap(T->K, T->U) // third version
>
>     and leave the second version out, since the third version can easily
>     simulate the second?
>
>


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