Kotiln
[Kotlin] 고차 함수
블린더르
2020. 6. 30. 14:53
고차 함수 정의
고차 함수
는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다.
표준 라이브러리 함수인 filter
는 술어 함수를 인자로 받으므로 고차 함수이다.
함수 타입
함수 타입을 정의하려면 함수 파라미터의 타입을 괄호 안에 넣고 그 뒤에 화살표 ->
를 추가한 다음, 함수의 반환 타입을 지정한다.
(Int, String) -> Unit
함수 타입에서도 반환 타입을 nullable
로 지정할 수 있다.
val canReturnNull: (Int) -> Int? = {null}
함수 타입 전체가 null
이 되게 선언할 수도 있다.
val funOrNull: ((Int, Int) -> Int)? = null
함수 타입에서 파라미터 이름을 지정할 수도 있다.
fun performRequest(url: String, callback: (code:Int, content: String) -> Unit){
callback(1, "abc");
};
performRequest("ab"){code, content ->
println(code);
println(content);
}
>>> 1
>>> abc
함수 타입의 람다를 정의할 때 파라미터 이름이 꼭 함수 타입 선언의 파라미터 이름과 일치하지 않아도 된다.
performRequest("ab"){code, page ->
println(code);
println(page);
}
인자로 받은 함수 호출
인자로 받은 함수를 호출하는 구문은 일반 함수를 호출하는 구문과 같다.
fun twoAndThree(operation: (Int, Int) -> Int){
val result = operation(2, 3)
println("result: $result")
}
>>> twoAndThree {a, b -> a + b}
>>> result: 5
자바에서 코틀린 함수 타입 사용
컴파일된 코드 안에서 함수 타입은 일반 인터페이스로 바뀐다.
각 인터페이스에 포함된 invoke
메소드를 호출하면 함수를 실행할 수 있다.
invoke
메소드에는 람다의 본문이 들어간다.
함수 타입을 사용하는 코틀린 함수를 자바에서도 쉽게 호출할 수 있다.
// 코틀린 선언
fun foo(bar: (Int) -> Int) {
println(f(32))
}
// 자바
foo(number -> number + 1);
>> 43
// 자바 8 이전
foo(new Function1<Integer, Integer>(){
@Override
public Integer invoke(Integer bar) {
System.out.println(bar);
return bar + 1;
}
}
디폴트 값을 지정한 함수 타입 파라미터
fun foo(bar: (f) -> String = {it.toString()}) {...}
nullable 함수 파라미터
fun foo(bar: ((f) -> String)? = null) {...}
함수를 반환하는 함수
fun foo() : (String) -> String {
return {str -> "${str}foo"};
}
val func = foo()
println(func("abc"));
>>> abcfoo
반응형