Dev/Kotlin

5장 람다로 프로그래밍

healthyryu 2018. 5. 28. 22:23

코틀린 람다 적용하기


1. 일반적인 루프 사용해서 컬렉션 검색

@Test
fun addition_isCorrect() {
val people = listOf(Person("Dev", 33), Person("Dave", 32), Person("Dori", 31))
findTheOldest(people)
}

data class Person(val name: String, val age: Int)

// 연장자 찾기
fun findTheOldest(people: List<Person>) {
var maxAge = 0
var theOldest: Person? = null

for (person in people) {
if (person.age > maxAge) {
maxAge = person.age
theOldest = person
}
}

println(theOldest)
}


2. 람다를 사용해 컬렉션 검색

@Test
fun addition_isCorrect() {
val people = listOf(Person("Dev", 33), Person("Dave", 32), Person("Dori", 31))
println(people.maxBy { it.age })
}

람다의 파라미터가 하나뿐이고 그 타입을 컬파일러가 추론할 수 있는 경우 it을 바로 쓸 수 있다.


3. 멤버 참조를 사용해 컬렉션 검색

@Test
fun addition_isCorrect() {
val people = listOf(Person("Dev", 33), Person("Dave", 32), Person("Dori", 31))
println(people.maxBy(Person::age))
}


람다를 변수에 저장할 때는 파라미터의 타입을 추론할 문맥이 없다. 그렇기에 파라미터 타입을 명시해야 한다.

val getAge = {p: Person -> p.name}

println(people.maxBy(getAge))


5. 메소드 안의 무명 내부 클래스에서 해당 메소드 안의 변수에 접근 가능

@Test
fun addition_isCorrect() {
var response = listOf("200 ok", "418 I'm a teapot", "500 Internal Server Error")
printProblemCounts(response)
}

fun printProblemCounts(response: Collection<String>) {
var clientErrors = 0
var serverErrors = 0

response.forEach {
if (it.startsWith("4")) {
clientErrors ++
}
else if (it.startsWith("5")) {
serverErrors++
}
}
println("$clientErrors client errors, $serverErrors server errors")
}

참고 : 기본적으로 메소드 안의 로컬 변수의 생명주기는 메소드가 반환되면 끝.

다만, 해당 로컬 변수를 람다가 가지고 있거나 다른 변수에 저장하면 로컬 변수의 생명주기와 메소드의 생명주기는 달라진다.



반응형

'Dev > Kotlin' 카테고리의 다른 글

코틀린 - 클래스, 객체, 인터페이스(요약)  (0) 2018.09.25
커니의 코틀린 - 3장 (데이터 클래스)  (0) 2018.07.16
let 함수  (0) 2018.06.21
엘비스 연산자 - ?:  (0) 2018.06.11
4장 - 클래스, 객체, 인터페이스  (0) 2018.05.27