Search code examples
javagrailsgroovy

GroupBy in Groovy


I'd like to GroupBy the subscription details by its ProductType with their corresponding List<Long> planReferenceIds

key: planSubscription.productSubscription.productType

value: planSubscription.planReferenceId

I can't seem to know how to do this the 'groovy way'

private static Map<ProductType, List<Long>> buildPlanSubscriptionDetails(List<PlanSubscription> planSubscriptions) {
        Map<ProductType, List<Long>> subscriptionDetails = [:]

        subscriptionDetails = planSubscriptions.groupBy({it.productSubscription.productType })

        return subscriptionDetails

Edit:

Here is what I've come up with but its not the Groovy way i guess

planSubscriptions.each { PlanSubscription planSubscription ->
            List<Long> planRefIds = subscriptionDetails.get(planSubscription.productSubscription.productType)

            if (planRefIds) {
                planRefIds.add(planSubscription.planReferenceId)
            } else {
                subscriptionDetails.put(planSubscription.productSubscription.productType, [planSubscription.planReferenceId] as List)
            }
        }

thank you in advance!


Solution

  • You should use collectEntries after grouping:

    Map<ProductType, List<Long>> result = subscriptionDetails
            .groupBy { it.productSubscription.productType }
            .collectEntries { pt, sd ->  [pt, sd*.planReferenceId]}