toMap options
Tim Peierls
tim at peierls.net
Tue Apr 9 17:23:13 PDT 2013
Easy if you know how! At any rate, it's doable, and this might serve as an
example for groupingBy.
--tim
On Tue, Apr 9, 2013 at 7:51 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> So you've got a Stream<T>, and you want a Map<K, Collection<V>>, and
> you've got a T->K called "f" and a T->V called "g". Easy:
>
> Map<K, Collection<V>> multiMap
> stream.collect(groupingBy(f, mapping(g, toList()));
>
>
> On 4/9/2013 7:48 PM, Tim Peierls wrote:
>
>> No objection, but now it makes me wonder: How do you get the effect of
>> toMultimap(T->K, T->V)? In other words, how would you get a Map<K,
>> Collection<V>> from a Stream<T> given T->K and T->V mappings?
>>
>> --tim
>>
>> On Tue, Apr 9, 2013 at 7:33 PM, Brian Goetz <brian.goetz at oracle.com
>> <mailto:brian.goetz at oracle.com**>> wrote:
>>
>> I'm good with #3. Any objections?
>>
>>
>> On 4/9/2013 7:28 PM, Sam Pullara wrote:
>>
>> I like version 3 as well.
>>
>> Sam
>>
>> On Apr 9, 2013, at 2:29 PM, Brian Goetz <brian.goetz at oracle.com
>> <mailto:brian.goetz at oracle.com**>> wrote:
>>
>> Currently we have:
>>
>> Collector<T, Map<T,U>>
>> toMap(Function<? super T, ? extends U> mapper)
>>
>> and
>>
>> <T, U, M extends Map<T, U>>
>> Collector<T, M>
>> toMap(Function<? super T, ? extends U> mapper,
>> Supplier<M> mapSupplier,
>> BinaryOperator<U> mergeFunction)
>>
>> (plus concurrent versions of both of these.) The former is
>> just sugar for:
>>
>> toMap(mapper, HashMap::new, throwingMerger())
>>
>> (We have predefined merge functions for throw-on-duplicates,
>> first-wins, and last-wins, called throwingMerger,
>> firstWinsMerger, and lastWinsMerger.)
>>
>> As has been noted, we do not yet serve the use case of
>> creating a map where the stream elements are the values of
>> the map instead of the keys of the map. Options for
>> addressing this are:
>>
>> 1. Leave toMap as is, add toIndexedMap (or toKeyedMap)
>> variants.
>>
>> 2. Leave toMap as is, add a two-function version of toMap:
>>
>> <T,K,U>
>> Collector<T, Map<K,U>>
>> toMap(Function<T, K> keyMapper,
>> Function<T, U> valueMapper)
>>
>> in which case the regular toMap becomes sugar for
>>
>> toMap(Function.identity(), mapper)
>>
>> 3. Get rid of the current form of toMap, and just have the
>> two-function form as in (2).
>>
>> 4. Break free of the toMap naming (recall that until
>> recently this was called mappedTo, and prior to that,
>> joiningWith), and have two versions: mappedTo and
>> mappedFrom. This is explicit, but also doesn't address the
>> use case where both key and value are functions of the
>> stream elements.
>>
>> Others?
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/attachments/20130409/6fb9d72c/attachment.html
More information about the lambda-libs-spec-experts
mailing list