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