TIL

Lec 17. 코틀린에서 람다를 다루는 방법

1. 코틀린에서의 람다

// 람다를 만드는 방법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 // ...
}

2. Closure

String name = "바나나";
name = "수박";

// name을 람다 변수로 사용할 수 없다 (컴파일 에러)
filterFruits(fruits, (fruit) -> name.equals(fruit.getName()));
var name = "바나나"
name = "수박"
// 문제 없음
filterFruits(fruits) { it.name == name }

3. 다시 try with resources

fun readFile(path: String?) {
    BufferedReader(FileReader(path)).use { reader -> 
        println(reader.readLine()) 
    }
}
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { ... }