코틀린 람다 적용하기
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 |