본문 바로가기

# 02/코틀린

[Kotlin] Higher-Order Functions

반응형

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