728x90
강의 링크 : https://www.edwith.org/boostcourse-mo-kotlin-basic1/joinLectures/28611
람다식과 고차함수 요약
- 람다식 :
{인자 -> 본문}
val sum : (Int, Int) -> Int = {x, y -> x+y}
val mul = {x:Int, y:Int -> x * y}
val add : (Int) -> Int = {it + 1} //it은 전달받은 인자를 의미 (함수 인자가 하나인 경우)
- 고차 함수 : 리턴값이나 인자가 함수인 함수
fun high(name : String, body : (Int)->Int) : Int
{
prinln("name : $name")
val x=0
return body(x)
}
//함수 호출
val res1 = high("TxT", {x->inc(x+3)})
//인자로 전달되는함수 인자가 하나인 경우 : it으로 대체 가능
val res2 = high("TxT") {inc(it+3)}
//매개변수가 없을 때 함수 이름만 사용
val res3 = high("TxT", ::inc) //inc는 람다식으로 변환됨
// 매개변수가 하나인 경우 + 람다식 전달
val res4 = high("TxT") {it+3}
클로저
- 람다식 함수에서 외부 변수에 접근할 수 있는 방법
- 외부 변수를 capture하여 사용
fun main() {
val calc = Calc()
var result = 0 // 외부의 변수
calc.addNum(2,3) { x, y -> result = x + y } // 클로저
println(result) // 값을 유지하여 5가 출력
}
class Calc {
fun addNum(a: Int, b: Int, add: (Int, Int) -> Unit) { // 람다식 add에는 반환값이 없음
add(a, b)
}
}
코틀린 표준 라이브러리
- 코틀린 표준 함수는 확장 함수 형태의 람다식으로 제공
- let() : 객체를 인자로 넘기고 결과값 반환
//main문 내
val score : Int?=32
// 기존 null검사
fun chkScore()
{
if (score != null) println("Score : $Score")
}
//let을 이용한 null검사 - null이면 {...}이 실행되지 않음
fun letChkScore()
{
score?.let{println("Score:$it)}
}
- also() : let은 결과값 반환, also는 함수에 전달한 객체를 반환
- 함수 블록 {...}의 마지막 문장을 let은 결과로 반환
- also를 사용 시 마지막 문장을 반환하지 않음 (=대입이 안됨)
var m=1
m = m.also{it+3} //m은 1 - 연산한 결과가 m에 대입되지 않음
- apply(): also와 같이 객체를 전달하고 반환받음
- also와 달리 확장 함수로 처리되므로 클래스 인자 접근 시 it을 사용하지 않아도 됨
val person = Person("", 0)
//apply
val result = person.apply {
name = "James"
age = 56
}
//also
val result = person.also {
it.name = "James"
it.age = 56
}
- run() : 익명 함수 / 객체 호출 두가지로 활용
- block 내용 수행 후 결과값을 반환
- 조건부 메소드 사용 가능
- apply와 다르게 객체에 접근하면서 함수 블록{...}의 마지막 결과가 실행됨
run
{
if (firstTimeView) introView else normalView
}.show()
- with() : 전달받은 객체를 처리
- safe call(?.)이 없으므로 let과 함께 쓰임
supportActionBar?.let {
with(it) {
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
}
- use() : 객체 사용 후 호출한 객체를 닫아줌(close())
- 파일을 사용할 때 유용
private fun readFirstLine() : String
{
BufferedReader(FileReader("text.txt")).use{ return it.readline() }
}
728x90