Merge pull request #9905 from anirban99/feature/ktln-154/collection-aggregate-operations-in-kotlin
KTLN-154 : Collection Aggregate Operations in Kotlin
This commit is contained in:
commit
9d6e17a4e0
|
@ -0,0 +1,7 @@
|
||||||
|
## Core Kotlin Collections
|
||||||
|
|
||||||
|
This module contains articles about core Kotlin collections.
|
||||||
|
|
||||||
|
### Relevant articles:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-kotlin-collections-2</artifactId>
|
||||||
|
<name>core-kotlin-collections-2</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.core-kotlin-modules</groupId>
|
||||||
|
<artifactId>core-kotlin-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-math3</artifactId>
|
||||||
|
<version>${commons-math3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${assertj.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-test</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<kotlin.version>1.3.30</kotlin.version>
|
||||||
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
|
<assertj.version>3.10.0</assertj.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,107 @@
|
||||||
|
package com.baeldung.aggregate
|
||||||
|
|
||||||
|
class AggregateOperations {
|
||||||
|
private val numbers = listOf(1, 15, 3, 8)
|
||||||
|
|
||||||
|
fun countList(): Int {
|
||||||
|
return numbers.count()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sumList(): Int {
|
||||||
|
return numbers.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun averageList(): Double {
|
||||||
|
return numbers.average()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun maximumInList(): Int? {
|
||||||
|
return numbers.max()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun minimumInList(): Int? {
|
||||||
|
return numbers.min()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun maximumByList(): Int? {
|
||||||
|
return numbers.maxBy { it % 5 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun minimumByList(): Int? {
|
||||||
|
return numbers.minBy { it % 5 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun maximumWithList(): String? {
|
||||||
|
val strings = listOf("Berlin", "Kolkata", "Prague", "Barcelona")
|
||||||
|
return strings.maxWith(compareBy { it.length % 4 })
|
||||||
|
}
|
||||||
|
|
||||||
|
fun minimumWithList(): String? {
|
||||||
|
val strings = listOf("Berlin", "Kolkata", "Prague", "Barcelona")
|
||||||
|
return strings.minWith(compareBy { it.length % 4 })
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sumByList(): Int {
|
||||||
|
return numbers.sumBy { it * 5 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sumByDoubleList(): Double {
|
||||||
|
return numbers.sumByDouble { it.toDouble() / 8 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foldList(): Int {
|
||||||
|
return numbers.fold(100) { total, it ->
|
||||||
|
println("total = $total, it = $it")
|
||||||
|
total - it
|
||||||
|
} // ((((100 - 1)-15)-3)-8) = 73
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foldRightList(): Int {
|
||||||
|
return numbers.foldRight(100) { it, total ->
|
||||||
|
println("total = $total, it = $it")
|
||||||
|
total - it
|
||||||
|
} // ((((100-8)-3)-15)-1) = 73
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foldIndexedList(): Int {
|
||||||
|
return numbers.foldIndexed(100) { index, total, it ->
|
||||||
|
println("total = $total, it = $it, index = $index")
|
||||||
|
if (index.minus(2) >= 0) total - it else total
|
||||||
|
} // ((100 - 3)-8) = 89
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foldRightIndexedList(): Int {
|
||||||
|
return numbers.foldRightIndexed(100) { index, it, total ->
|
||||||
|
println("total = $total, it = $it, index = $index")
|
||||||
|
if (index.minus(2) >= 0) total - it else total
|
||||||
|
} // ((100 - 8)-3) = 89
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reduceList(): Int {
|
||||||
|
return numbers.reduce { total, it ->
|
||||||
|
println("total = $total, it = $it")
|
||||||
|
total - it
|
||||||
|
} // (((1 - 15)-3)-8) = -25
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reduceRightList(): Int {
|
||||||
|
return numbers.reduceRight() { it, total ->
|
||||||
|
println("total = $total, it = $it")
|
||||||
|
total - it
|
||||||
|
} // ((8-3)-15)-1) = -11
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reduceIndexedList(): Int {
|
||||||
|
return numbers.reduceIndexed { index, total, it ->
|
||||||
|
println("total = $total, it = $it, index = $index")
|
||||||
|
if (index.minus(2) >= 0) total - it else total
|
||||||
|
} // ((1-3)-8) = -10
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reduceRightIndexedList(): Int {
|
||||||
|
return numbers.reduceRightIndexed { index, it, total ->
|
||||||
|
println("total = $total, it = $it, index = $index")
|
||||||
|
if (index.minus(2) >= 0) total - it else total
|
||||||
|
} // ((8-3) = 5
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
package com.baeldung.aggregate
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class AggregateOperationsUnitTest {
|
||||||
|
|
||||||
|
private val classUnderTest: AggregateOperations = AggregateOperations()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenCountOfList_thenReturnsValue() {
|
||||||
|
assertEquals(4, classUnderTest.countList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenSumOfList_thenReturnsTotalValue() {
|
||||||
|
assertEquals(27, classUnderTest.sumList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenAverageOfList_thenReturnsValue() {
|
||||||
|
assertEquals(6.75, classUnderTest.averageList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMaximumOfList_thenReturnsMaximumValue() {
|
||||||
|
assertEquals(15, classUnderTest.maximumInList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMinimumOfList_thenReturnsMinimumValue() {
|
||||||
|
assertEquals(1, classUnderTest.minimumInList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMaxByList_thenReturnsLargestValue() {
|
||||||
|
assertEquals(3, classUnderTest.maximumByList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMinByList_thenReturnsSmallestValue() {
|
||||||
|
assertEquals(15, classUnderTest.minimumByList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMaxWithList_thenReturnsLargestValue(){
|
||||||
|
assertEquals("Kolkata", classUnderTest.maximumWithList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenMinWithList_thenReturnsSmallestValue(){
|
||||||
|
assertEquals("Barcelona", classUnderTest.minimumWithList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenSumByList_thenReturnsIntegerValue(){
|
||||||
|
assertEquals(135, classUnderTest.sumByList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenSumByDoubleList_thenReturnsDoubleValue(){
|
||||||
|
assertEquals(3.375, classUnderTest.sumByDoubleList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenFoldList_thenReturnsValue(){
|
||||||
|
assertEquals(73, classUnderTest.foldList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenFoldRightList_thenReturnsValue(){
|
||||||
|
assertEquals(73, classUnderTest.foldRightList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenFoldIndexedList_thenReturnsValue(){
|
||||||
|
assertEquals(89, classUnderTest.foldIndexedList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenFoldRightIndexedList_thenReturnsValue(){
|
||||||
|
assertEquals(89, classUnderTest.foldRightIndexedList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenReduceList_thenReturnsValue(){
|
||||||
|
assertEquals(-25, classUnderTest.reduceList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenReduceRightList_thenReturnsValue(){
|
||||||
|
assertEquals(-11, classUnderTest.reduceRightList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenReduceIndexedList_thenReturnsValue(){
|
||||||
|
assertEquals(-10, classUnderTest.reduceIndexedList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenReduceRightIndexedList_thenReturnsValue(){
|
||||||
|
assertEquals(5, classUnderTest.reduceRightIndexedList())
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@
|
||||||
<module>core-kotlin-advanced</module>
|
<module>core-kotlin-advanced</module>
|
||||||
<module>core-kotlin-annotations</module>
|
<module>core-kotlin-annotations</module>
|
||||||
<module>core-kotlin-collections</module>
|
<module>core-kotlin-collections</module>
|
||||||
|
<module>core-kotlin-collections-2</module>
|
||||||
<module>core-kotlin-concurrency</module>
|
<module>core-kotlin-concurrency</module>
|
||||||
<module>core-kotlin-date-time</module>
|
<module>core-kotlin-date-time</module>
|
||||||
<module>core-kotlin-design-patterns</module>
|
<module>core-kotlin-design-patterns</module>
|
||||||
|
|
Loading…
Reference in New Issue