# Server Side Kotlin-10

The **groupBy()** method in Kotlin is used to group elements of a collection based on a specified key. It operates on various collections like lists and returns a map where each group key is associated with a list of elements that share the same key.
This groups elements by their lengths, resulting in a map where keys are lengths, and values are lists of corresponding elements.   
**groupBy()**  is a  extension functions for grouping collection elements. It  takes a lambda function and returns a Map, where each key is the lambda result and the corresponding value is the List of elements on which this result is returned. 

**KeySelector** Function:
The method takes a keySelector function, which is applied to each element to determine its key for grouping   
groupBy() can be called with a second lambda argument – a value transformation function, which is key selector. In  groupBy() with two lambdas, the keys produced by **keySelector** function are mapped to the  List of the elements .
```
val games = listOf("unity", "unreal", "godot", "bevy")

println(games.groupBy { it.first().uppercase() })
println(games.groupBy(keySelector = { it.first() }, valueTransform = { it.uppercase() }))
```
outputt:   

`{U=[unity, unreal], G=[godot], B=[bevy]}`   

`{u=[UNITY, UNREAL], g=[GODOT], b=[BEVY]}`

Namely, Grouping supports the following operations:

**eachCount()** counts the elements of every group.

**fold() and reduce()** perform fold and reduce operations for every group but as a separate collection .

**aggregate()** applies a given operation subsequently to every elements in each group and returns the result. 
```
val games = listOf("unity", "unreal", "godot", "bevy")

println(games.groupingBy { it.first() }.eachCount())    
```   
output    

`{u=2, g=1, b=1}`


