Skip to content

Commit 3ff1a55

Browse files
committed
[impr-flatten-vs-flatmap] add flatten()
1 parent e081186 commit 3ff1a55

File tree

2 files changed

+80
-37
lines changed

2 files changed

+80
-37
lines changed

core-kotlin-modules/core-kotlin-collections-2/src/test/kotlin/com/baeldung/mapvsflatmap/MapVsFlatMapUnitTest.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.baeldung.mapvsflatmapvsflatten
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.Test
5+
import kotlin.test.assertEquals
6+
7+
class MapVsFlatMapVsFlattenUnitTest {
8+
9+
@Test
10+
fun `map should convert each element to another element`() {
11+
val order = Order(
12+
listOf(OrderLine("Tomato", 2), OrderLine("Garlic", 3), OrderLine("Chives", 2))
13+
)
14+
15+
val names = order.lines.map { it.name }
16+
val totalPrice = order.lines.map { it.price }.sum()
17+
18+
assertThat(names).containsExactly("Tomato", "Garlic", "Chives")
19+
assertEquals(7, totalPrice)
20+
}
21+
22+
@Test
23+
fun `flatMap should flatten the one-to-many relation as expected`() {
24+
val orders = listOf(
25+
Order(listOf(OrderLine("Garlic", 1), OrderLine("Chives", 2))),
26+
Order(listOf(OrderLine("Tomato", 3), OrderLine("Garlic", 4))),
27+
Order(listOf(OrderLine("Potato", 5), OrderLine("Chives", 6))),
28+
)
29+
30+
val lines: List<OrderLine> = orders.flatMap { it.lines }
31+
val names = lines.map { it.name }.distinct()
32+
assertThat(names).containsExactlyInAnyOrder("Garlic", "Chives", "Tomato", "Potato")
33+
}
34+
35+
@Test
36+
fun `flatten should flatten the nested collections without transformation`() {
37+
val orderLines = listOf(
38+
listOf(OrderLine("Garlic", 1), OrderLine("Chives", 2)),
39+
listOf(OrderLine("Tomato", 3), OrderLine("Garlic", 4)),
40+
listOf(OrderLine("Potato", 5), OrderLine("Chives", 6)),
41+
)
42+
43+
val lines: List<OrderLine> = orderLines.flatten()
44+
val expected = listOf(
45+
OrderLine("Garlic", 1),
46+
OrderLine("Chives", 2),
47+
OrderLine("Tomato", 3),
48+
OrderLine("Garlic", 4),
49+
OrderLine("Potato", 5),
50+
OrderLine("Chives", 6),
51+
)
52+
assertThat(lines).hasSize(6).isEqualTo(expected)
53+
}
54+
55+
@Test
56+
fun `flatMap should get same result of map and then flatten`() {
57+
val orders = listOf(
58+
Order(listOf(OrderLine("Garlic", 1), OrderLine("Chives", 2))),
59+
Order(listOf(OrderLine("Tomato", 3), OrderLine("Garlic", 4))),
60+
Order(listOf(OrderLine("Potato", 5), OrderLine("Chives", 6))),
61+
)
62+
63+
val expected = listOf(
64+
OrderLine("Garlic", 1),
65+
OrderLine("Chives", 2),
66+
OrderLine("Tomato", 3),
67+
OrderLine("Garlic", 4),
68+
OrderLine("Potato", 5),
69+
OrderLine("Chives", 6),
70+
)
71+
72+
val resultMapAndFlatten: List<OrderLine> = orders.map { it.lines }.flatten()
73+
val resultFlatMap:List<OrderLine> = orders.flatMap { it.lines }
74+
75+
assertThat(resultFlatMap).isEqualTo(resultMapAndFlatten).hasSize(6).isEqualTo(expected)
76+
}
77+
}
78+
79+
data class Order(val lines: List<OrderLine>)
80+
data class OrderLine(val name: String, val price: Int)

0 commit comments

Comments
 (0)