val fruits = listOf<Fruit>(
Fruit("사과", 1_000),
Fruit("사과", 1_200),
Fruit("사과", 1_200),
Fruit("사과", 1_500),
Fruit("바나나", 3_000),
Fruit("바나나", 3_200),
Fruit("바나나", 2_500),
Fruit("수박", 10_000),
)
val isApple1 = fun(fruit: Fruit): Boolean {
return fruit.name == "사과"
}
// 타입 선언 (파라미터타입) -> 반환타입
val isApple1_1: (Fruit) -> Boolean = fun(fruit: Fruit): Boolean {
return fruit.name == "사과"
}
val isApple2 = {fruit: Fruit -> fruit.name == "사과"}
// 타입 선언 (파라미터타입) -> 반환타입
val isApple2_1: (Fruit) -> Boolean = {fruit: Fruit -> fruit.name == "사과"}
// 람다를 직접 호출하는 방법 1
isApple1(fruits[0])
// 람다를 직접 호출하는 방법 2
isApple1.invoke(fruits[0])
private fun filterFruits(
fruits: List<Fruit>,
fruitFilter: (Fruit)->Boolean // 람다
): List<Fruit> = fruits.filter {fruitFilter(it)}
filterFruits(fruits, isApple1 )
// 직접 선언
filterFruits(fruits, { fruit: Fruit -> fruit.name=="사과"} )
// 마지막 파라미터가 함수인 경우 소괄호 밖에 람다사용 가능
filterFruits(fruits) { fruit: Fruit -> fruit.name=="사과"}
var par = "바나나"
par = "수박"
val ret = filterFruits(fruits) { it.name==par}
Closure란 Kotlin에서 람다가실행되고 있는 시점에 쓰고 있는 변수들을 모두 포획한다. 이 데이터구조를 Closure라고 한다. 그렇기 때문에 final이 아닌 변화하는 var 변수도 사용될 수 있다.