GS Collections Kata w/ JCF Solutions

Arul Dhesiaseelan aruld at acm.org
Wed Jan 16 19:19:51 PST 2013


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-libs-spec-observers mailing list