GS Collections Kata w/ JCF Solutions
Arul Dhesiaseelan
aruld at acm.org
Wed Jan 16 19:30:07 PST 2013
Sorry for cross-posting to EG. Hit reply all too soon. I cancelled my
posting to EG, copying to lambda-dev instead :-)
- Arul
On Wed, Jan 16, 2013 at 5:19 PM, Arul Dhesiaseelan <aruld at acm.org> wrote:
> Try this (works with b73):
>
>
> Map<Double, Collection<Customer>> multimap =
> this.company.getCustomers()
> .stream()
> .collect(Collectors.<Customer, Double>groupBy((Customer
> customer) ->
> customer.getOrders()
> .stream()
> .explode((Stream.Downstream<LineItem>
> downstream, Order order) -> downstream.send(order.getLineItems()))
> .map(LineItem::getValue)
> .max(Comparators.naturalOrder())
> .get()));
>
> I used this in a similar context here [1]
>
> -Arul
>
> [1]
> https://github.com/aruld/java-oneliners/blob/master/src/main/java/com/aruld/oneliners/Item10.java
>
>
>
> On Wed, Jan 16, 2013 at 2:15 PM, Raab, Donald <Donald.Raab at gs.com> wrote:
>
>> Great suggestion. I just gave it a try. Max takes a comparator and
>> returns Optional so you have to add a call to get(). I was able to change
>> the example to the following:
>>
>> Map<Double, Collection<Customer>> multimap = this.company.getCustomers()
>> .stream()
>> .collect(Collectors.<Customer, Double>groupBy((Customer customer) ->
>> customer.getOrders()
>> .stream()
>> .explode((Stream.Downstream<LineItem> downstream, Order
>> order) -> {
>> downstream.send(order.getLineItems());
>> })
>> .map(LineItem::getValue)
>> .max(Comparators.naturalOrder())
>> .get()));
>>
>> I get an unchecked error on Comparators.naturalOrder() in IntelliJ, but
>> adding <Double> there makes it ugly.
>>
>> This is the GS Collections version of the kata, which also used max(),
>> but calls this method on a DoubleIterable:
>>
>> MutableListMultimap<Double, Customer> multimap =
>> this.company.getCustomers()
>> .groupBy(customer -> customer.getOrders()
>> .asLazy()
>> .flatCollect(Order::getLineItems)
>> .collectDouble(LineItem::getValue)
>> .max());
>>
>> Unfortunately, the type inference seems to be very successful at
>> thwarting me trying to simplify the above example using the stream library
>> features. I would like to simplify down to this but can't seem to get it
>> to work:
>>
>> Map<Double, Collection<Customer>> multimap = this.company.getCustomers()
>> .stream()
>> .collect(groupBy((customer) ->
>> customer.getOrders()
>> .stream()
>> .explode((downstream, order) -> {
>> downstream.send(order.getLineItems());
>> })
>> .map(LineItem::getValue)
>> .max(Comparators.naturalOrder())
>> .get()));
>>
>>
>> From: Joe Bowbeer [mailto:joe.bowbeer at gmail.com]
>> Sent: Wednesday, January 16, 2013 4:21 PM
>> To: Raab, Donald [Tech]
>> Cc: lambda-libs-spec-experts at openjdk.java.net; Motlin, Craig P. [Tech];
>> Weir, John [Tech]
>> Subject: Re: GS Collections Kata w/ JCF Solutions
>>
>> Thanks.
>>
>>
>> Would it be better to rewrite the following using Stream.max()?
>>
>>
>> .reduce(0.0, (x, y) -> Math.max(x, y))
>>
>> --Joe
>>
>>
>>
>
>
More information about the lambda-dev
mailing list