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