// 람다를 만드는 방법1
val isApple = fun(fruit: Fruit): Boolean {
return fruit.name == "사과"
}
// 람다를 만드는 방법 2
val isApple2 = { fruit: Fruit -> fruit.name == "사과" }
// 람다를 호출하는 방법 1
isApple(Fruit("사과", 1000))
// 람다를 호출하는 방법 2
isApple.invoke(Fruit("사과", 1000))
(파라미터 타입…) → 반환 타입
fun main() {
filterFruits(fruits, { fruit: Fruit -> fruit.name == "사과" })
// 람다 함수가 가장 마지막 파라미터에 위치하고 있으면 람다 함수 중괄호를 밖으로 뺄 수 있다.
// 타입 추론이 가능해서 타입 생략 가능
filterFruits(fruits) { fruit -> fruit.name == "사과" }
// 람다 파라미터를 it으로 직접 참조할 수 있다.
filterFruits(fruits) { it.name == "사과" }
// 람다를 여러줄 작성해도 마지막 줄 결과가 람다의 반환값이 된다.
filterFruits(fruits) {
println("사과만 받는다.")
it.name == "사과" // 반환
}
}
private fun filterFruits(
fruits: List<Fruit>,
filter: (Fruit) -> Boolean
) : List<Fruit> {
return // ...
}
final
변수만 사용할 수 있다.String name = "바나나";
name = "수박";
// name을 람다 변수로 사용할 수 없다 (컴파일 에러)
filterFruits(fruits, (fruit) -> name.equals(fruit.getName()));
final
이 아니어도 사용 가능하다.var name = "바나나"
name = "수박"
// 문제 없음
filterFruits(fruits) { it.name == name }
fun readFile(path: String?) {
BufferedReader(FileReader(path)).use { reader ->
println(reader.readLine())
}
}
use
를 활용해 try with resources
를 대체한다.public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { ... }
use
함수
T : Closeable
- Closeable
구현체에 대한 확장 함수inline
- 인라인 함수block: (T) -> R
- T
타입을 받아 R
타입을 반환하는 람다를 파라미터로 받고 있다.close()
를 호출하여 안전하게 자원을 닫을 수 있다.