TIL

아이템 38 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라

interface OnClick {
	fun clicked(view: View)
}

fun setOnClickListener(listener: OnClieck) { /*...*/ }
fun setOnClickListener(listener: (View) -> Unit) { /*...*/ }
// 람다 표현식
setOnClieckListener { /*...*/ }

// 익명 함수
setOnClickListener(fun(view) { /*...*/ })

// 함수 레퍼런스
setOnClickListener(::println)

// 제한된 함수 레퍼런스
setOnClickListener(this::showUsers)

// 선언된 함수 타입을 구현한 객체로 전달
class ClieckListener: (View) -> Unit {
	override fun invoke(view: View) { /*...*/ }
}

setOnClickListener(ClieckListener())
typealias OnClieck = (View) -> Unit

fun setOnClickListener(listener: OnClieck) { /*...*/ }
// 함수 타입을 받는 forEach
inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit

val list = listOf(Pair(1, "a"), Pair(2, "b"))
// 구조 분해 가능
list.forEach { (num, str) -> println("$num, $str") }

언제 SAM을 사용해야 할까?