Skip to content

Commit cb2a815

Browse files
committed
[fun-as-parm] pass fun as param
1 parent 15a58ad commit cb2a815

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.baeldung.functionAsParameter
2+
3+
import com.baeldung.functionAsParameter.Sender.*
4+
import org.junit.jupiter.api.Test
5+
import kotlin.test.assertEquals
6+
7+
fun joinByOperation(theList: List<String>, operation: (List<String>) -> String): String {
8+
return operation(theList)
9+
}
10+
11+
12+
data class TheMessage(val sender: Sender, val segments: List<String>) {
13+
fun parse(operation: (List<String>) -> String): String {
14+
return "Message From $sender is: ${operation(segments)}"
15+
}
16+
}
17+
18+
enum class Sender {
19+
User, RemoteAPI, PartnerApp, CsvSender
20+
}
21+
22+
23+
class MessageParser {
24+
fun joinWithoutPlaceholder(segments: List<String>): String {
25+
return segments.joinToString(separator = " ").replace(" [SPACE] ", " ")
26+
}
27+
28+
companion object {
29+
fun simplyJoin(segments: List<String>): String {
30+
return segments.joinToString(separator = " ")
31+
}
32+
}
33+
}
34+
35+
36+
object ParserInObject {
37+
fun joinWithoutComma(segments: List<String>): String {
38+
return segments.joinToString(separator = " ") { it.replace(",", "") }
39+
}
40+
}
41+
42+
fun decrypt(segments: List<String>): String {
43+
return segments.reversed().joinToString(separator = " ") { it.reversed() }
44+
}
45+
46+
val messageParser = MessageParser()
47+
fun parseMessage(message: TheMessage): String {
48+
return when (message.sender) {
49+
User -> message.parse(MessageParser::simplyJoin)
50+
PartnerApp -> message.parse(messageParser::joinWithoutPlaceholder)
51+
CsvSender -> message.parse(ParserInObject::joinWithoutComma)
52+
RemoteAPI -> message.parse(::decrypt)
53+
}
54+
}
55+
56+
class FunctionAsParameterUnitTest {
57+
58+
@Test
59+
fun `when passing lambda as parameters then get expected result`() {
60+
val input = listOf("a b c", "x y z", "kotlin")
61+
val result1 = joinByOperation(input) { theList ->
62+
theList.joinToString(separator = " ") { str -> str.reversed() }.replace(" ", ", ")
63+
}
64+
assertEquals("c, b, a, z, y, x, niltok", result1)
65+
66+
val result2 = joinByOperation(input) { theList ->
67+
theList.reversed().joinToString(separator = " ") { str -> str }.uppercase()
68+
}
69+
assertEquals("KOTLIN X Y Z A B C", result2)
70+
71+
}
72+
73+
@Test
74+
fun `when passing existing fun as parameters then get expected result`() {
75+
76+
77+
val msgFromUser = TheMessage(User, listOf("a b c", "d e f", "x y z"))
78+
val resultUser = parseMessage(msgFromUser)
79+
assertEquals("Message From User is: a b c d e f x y z", resultUser)
80+
81+
val msgFromPartner = TheMessage(PartnerApp, listOf("a [SPACE] b [SPACE] c", "d [SPACE] e [SPACE] f", "x [SPACE] y [SPACE] z"))
82+
val resultPartner = parseMessage(msgFromPartner)
83+
assertEquals("Message From PartnerApp is: a b c d e f x y z", resultPartner)
84+
85+
val msgFromCsv = TheMessage(CsvSender, listOf("a, b, c", "d, e, f", "x, y, z"))
86+
val resultCsv = parseMessage(msgFromCsv)
87+
assertEquals("Message From CsvSender is: a b c d e f x y z", resultCsv)
88+
89+
val msgFromAPI = TheMessage(RemoteAPI, listOf("z y x", "f e d", "c b a"))
90+
val resultApi = parseMessage(msgFromAPI)
91+
assertEquals("Message From RemoteAPI is: a b c d e f x y z", resultApi)
92+
}
93+
}

0 commit comments

Comments
 (0)