Additional Collectors
Ali Ebrahimi
ali.ebrahimi1781 at gmail.com
Wed Apr 3 12:08:24 PDT 2013
Hi,
On Wed, Apr 3, 2013 at 11:01 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> 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?
yes, but this is runtime safe solution. My suggestion was compile time safe.
Ali Ebrahimi
>
>
> 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