티스토리 뷰

728x90

1. Higer-Order Functions

  • 함수를 파라메터로 전달하거나, 함수를 리턴 가능
  • lamda를 통해 축약 형태로 제공

- 파라메터 정의 (3가지)

1) 파라메터 없는 경우

fun print(body: () -> String) {
    println(body())
}

@Test
fun test() {
    print({"test"})
}

아래 함수는 위와 같다. 

fun print() {
    println(body())
}

@Test
fun test() {
	print()
}

fun body() = "return message"

 

2) 파라메터 1개인 경우

fun print(body: (String) -> String) {
    println(body("print message"))
}

@Test
fun test() {
    print({ message ->
    	"$message return message"
        })
}        

 

3) 1개 이상인 경우

fun print(body: (String, String) -> String) {
    println(body("One", "Two"))
}

@Test
fun test() {
    print({ one, two ->
    	"$one, $two, return message"
        })
}        

 


- 괄호 축약

사용하는 측에서는 괄호 제거가 가능하다.

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 Function 이 2개인 경우

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"
        })
        
}           

첫번째 body는 괄호, 두번째는 괄호 x  처리도 가능하다. 

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"
           }
           
    // 위의 코드와 같다      
    print({ one, two -> "$one, $two, return message" }) {
        	"body 2 return message"
           }
}           


 

마지막 람다 활용 방식을 Trailing Lamda 라고 불린다. 


 

- 변수에 Higher-Order Function 정의 하기 

var higherOrderFunction: () -> Unit = {
    println("Print!!!")
}

@Test
fun test() {
    higherOrderFunction()
}
var higherOrderFunction: (String) -> Unit = {
    println("$it is String!!!")
}

@Test
fun test() {
    higherOrderFunction("hi")
}

() -> Unit 의 의미는? 파라미터 없고, 리턴없다(Unit) 라는 뜻

 

lateinit 을 이용할 수도 있다. 

lateinit var higherOrderFunction: (String) -> Unit

@Test
fun test() {
    higherOrderFunction = {
    	println("print!!")
    }
}

 

java 에서는 어떻게 보일까?

ExampleKotlinUnitTest exampleKotlinUnitTest = new ExampleKotlinUnitTest();
exampleKotlinUnitTest.setHigherOrderFunction(new Funtion1<String, Unit>() {
    @Override
    public Unit invoke(String s) {
    	System.out.println(s);
        return null;
    	}
    });
    
exampleKotlinUnitTest.higherOrderFunction.invoke("ABC");
    

 

이렇게도 할 수 있다.

fun higherOrder(body: (Int, Int) -> Int) = body(20, 10)
fun sum(a: Int, b: Int) = a + b
fun minus(a: Int, b: Int) = a - b
fun multiply(a: Int, b: Int) = a * b
fun division(a: Int, b: Int) = a / b

@Test
fun test() {
    println(higherOrder(::sum))
    println(higherOrder(::minus))
    println(higherOrder(::multiply))
    println(higherOrder(::division))
}    

아래와 같이 코드를 줄일 수도 있다. 

fun higherOrder(body: (Int, Int) -> Int) = body(20, 10)

@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})

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함