Higher-Order Functions
- 함수를 파라미터로 전달하거나, 함수를 리턴 가능
- lambda를 통해 축약 형태로 제공
- 변수로 함수를 가질 수 있다.
Higher-Order Functions 샘플
fun <T> lock(lock : Lock, body : () -> T) : T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
]
}
/* fun <T> body() : T {
return T
} */
- 파라미터 이름 : body
- 정의 : () -> T
Higher-Order Functions 사용하기
fun toBeSynchronized() = sharedResource.operation()
val result = lock(lock, ::toBeSynchronized)
파라미터 정의 - 파라미터가 없을 경우
fun print(body : () -> String) {
println(body())
}
@Test
fun test() {
print({ "return message" })
}
// 다른 표현
fun print() {
println(body())
}
@Test
fun test() {
print()
}
fun body() = "return message"
파라미터 정의 - 1개인 경우
fun print(body : (String) -> String) {
println(body("print message"))
}
@Test
fun test() {
print ({ message ->
"$message return message"
})
}
파라미터 정의 - 1개 이상인 경우
fun print(body : (String, String) -> String) {
println(body("One", "Two"))
}
@Test
fun test() {
print ({ one, two ->
"$one, $two, return message"
})
}
사용하는 측에서 -괄호 제거하기
- 마지막 Higher-Order Functions에서는 () 제거 가능
fun print(body : (String, String) -> String) {
println(body("One", "Two"))
}
@Test
fun test() {
// print({ one, two ->
// "$one, $two, return message"
// })
print { one, two ->
"$one, $two, return message"
}
}
사용하는 측에서 - Higher-Order Functions 2개인 경우
- 마지막 Higher-Order Functions에서는 () 제거 가능
fun print(body : (String, String) -> String, body2 : () -> String ) {
println("$body("One", "Two")} ${body2()}")
}
@Test
fun test() {
print ({ one, two ->
"$one, $two, return message"
}) {
"body 2 return message"
}
}
다른 메소드를 직접 호출하기
fun print(body : (String, String) -> String) {
println(body("One", "Two"))
}
fun message ( a : String, b : String ) = "$a, $b"
@Test
fun test() {
print { one, two ->
message(one, two)
}
}
// 다른 방법으로 구현 가능
fun print(body : (String, String) -> String) {
println(body("One", "Two"))
}
fun message ( a : String, b : String ) = "$a, $b"
@Test
fun test() {
print (::message)
}
변수에 Higher-Order Functions 정의하기
var higherOrderFunction : () -> Unit = {
println("Print!!!")
}
@Test
fun test() {
higherOrderFunction()
}
// lateinit 사용
lateinit var higherOrderFunction : (String) -> Unit
@Test
fun test() {
higherOrderFunction = {
println("Print!!!")
}
}
// 코틀린에서 정의한 Higher-Order Functions 자바에서 사용하기
ExampleKotlinUnitTest exampleKotlinUnitTest = new ExampleKotlinUnitTest ();
exampleKotlinUnitTest.setHigherOrderFunction(new Functionl<String, Unit>() {
@Override
public Unit invoke (String s) {
System.out.println(s);
return null;
}
});
exampleKotlinUnitTest.higherOrderFunction.invoke("ABC");
Higher-Order Functions
@Test
fun test() {
println(higherOrder { a, b -> a + b })
println(higherOrder { a, b -> a - b })
println(higherOrder { a, b -> a * b })
println(higherOrder { a, b -> a / b })
}
fun higherOrder(body : (Int, Int) -> Int) = body(20, 10)
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] Generics (0) | 2019.07.15 |
---|---|
[Kotlin] 유용한 kotiln Standard 라이브러리 (0) | 2019.07.12 |
[Kotlin] Class etc (0) | 2019.07.12 |
[Kotlin] Sealed Classes (0) | 2019.07.12 |
[Kotlin] Companion Object (0) | 2019.07.12 |