반응형
- 출처 https://www.youtube.com/watch?v=Q5noYbbc9uc [Code with Joyce]
- 익명 함수 (Anonymous Functions)를 지칭하는 용어
- 함수를 간편하게 작성할수 있어서 다른 함수의 인수로 넣을 때 사용
- 람다식은 우리가 마치 value 처럼 다를 수 있는 익명함수
- 형식 { parameter -> 내용}
- 람다 함수는 항상 { }으로 감싸서 표현
- {} 안에 "->" 표시가 있으며 "->" 왼쪽은 매개변수, 오른쪽은 함수 내용
- 매개변수는 ( )로 감싸지 않음
- 매개변수 타입을 선언해야 하며 예상 가능할때 생략 가능
- 함수의 반환값은 함수 내용의 마지막 표현식
- 함수의 맨 마지막 인자가 람다라면 () 안에서 빼내서 밖에 람다를 표현할 수 있음
- 인자가 하나라면 그 인자는 람다식 내부에서 it으로 받을 수 있음
- 인자가 하나이면서 그 인자가 람다타입 이라면 ()를 생략가능
- val square: (Int) -> Int = {number: Int -> number *number}
- val square = {number: Int -> number *number}
- val square : (Int) -> Int = { number -> number *number}
- 모두 동일한 구문 임
val square : (Int) -> Int = { number -> number *number}
var nameAge : (String,Int) -> String = { name,age -> "my name is ${name} I'm ${age}"}
fun main(){
println(square(12)) // 결과값 144
println(nameAge("joyce", 99)) // 결과값 my name is joyce I'm 99
}
- 함수의 반환값은 함수 내용의 마지막 표현식
fun main(){
val sum = { x: Int, y: Int -> println("Computing the sum of $x and $y...")
x + y
}
println(sum(1, 2))
}
- 파라미터가 하나만 존재할경우 해당 파라미터 name을 생략하고 it 으로 받을 수 있음
// 기본
fun main(){
val myname = { name: String ->"Hello. My name is ${name}"}
val result = myname("kanginman")
println(result) //결과값 Hello. My name is kanginman
}
// 파라미터 이름을 생략하고 it으로 받은 경우
fun main(){
val greeting: (String) -> String = { "Hello. My name is ${it}"}
val result = greeting("kanginman")
println(result) //결과값 Hello. My name is kanginman
}
- 예
- compareNumber({it > 3.22})
- compareNumber {it > 3.22}
- 모두 동일한 구문 임
fun compareNumber(func : (Double) -> Boolean) : Boolean {
return func(5.2343)
}
fun main(){
println(compareNumber({it > 3.22})) //결과값 true
}
// compareNumber 의 파라미터로 전달된 값을 풀어 쓰자면 아래의 형태로 전달된 것임
// var func : (Double) -> Boolean = {it > 3.22}
// return func(5.2343) 5.2343 > 3.22 의 값은 true 이기 때문에 true를 반환
- it을 사용하지 않는경우
fun compareNumber(func : (Double) -> Boolean) : Boolean {
return func(5.2343)
}
fun main(){
println(compareNumber({number: Int ->number === 4.3212})) //결과값 true
}
// var func : (Double) -> Boolean = {number -> number === 4.3212}
// return func(5.2343) 5.2343 === 4.3212 의 값은 false 이기 때문에 false를 반환
- 확장함수
- 기존 class 에 새로운 함수를 추가
- 수정할 수없는 타사 라이브러리에서 클래스에 대한 새 함수를 작성할 수 있음
- 형식 fun class명.함수명(파라미터): return type {/../}
- 확장함수를 선언하기 위해 함수의 이름앞에 확장하고자 하는 클래스의 타입을 붙여줘야한다. 이때 이 클래스의 타입을 Reciver type 이라고 함
- 확장함수에서 this는 receive type 에 대응
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
fun main(){
val list = mutableListOf(1, 2, 3)
list.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'list'
}
================================================
//일반적인 확장 함수
fun String.pizzaIsGreat():String {
return this + "Pizza is the best!"
}
fun String.pizzaIsGreat():String = this + "Pizza is the best!"
fun main(){
val a = "joyce said"
val b = "mac said"
println(a.pizzaIsGreat())
println(b.pizzaIsGreat())
}
// 결과값
// joyce saidPizza is the best!
// mac saidPizza is the best!
- 람다의 확장 함수
//람다식 확장함수 에서는 String.() 에서 String 이 receive type 이 된다.
val pizzaIsGreat : String.() -> String = {
this + "Pizza is the best!"
}
fun main(){
val a = "joyce said"
val b = "mac said"
println(a.pizzaIsGreat())
println(b.pizzaIsGreat())
}
// 결과값
// joyce saidPizza is the best!
// mac saidPizza is the best!
================================================
fun extendString(name : String, age : Int) : String {
val introduceMyself : String.(Int) -> String = {"I am ${this} and ${it} years old"}
return name.introduceMyself(age)
}
fun main(){
println(extendString("ariana",27)) //결과값 I am ariana and 27 years old
}
- 람다의 when
val calculateGrade : (Int) -> String = {
when(it) {
in 0..40 -> "fail"
in 41..70 -> "pass"
in 71..100 -> "perfect"
else -> "Error"
}
}
fun main() {
print(calculateGrade(97)) // 결과값 perfect
print(calculateGrade(971)) // 결과값 Error
}
'코틀린+안드로이드' 카테고리의 다른 글
14. 인터페이스 interface (0) | 2020.07.18 |
---|---|
13. companion object (0) | 2020.07.18 |
11. class (0) | 2020.07.17 |
10. for, while (0) | 2020.07.17 |
9. Nullable / NonNull (0) | 2020.07.17 |