코틀린+안드로이드

12. Lambdas 람다

으누아빠 2020. 7. 17. 23:41
반응형
  1. 익명 함수 (Anonymous Functions)를 지칭하는 용어
  2. 함수를 간편하게 작성할수 있어서 다른 함수의 인수로 넣을 때 사용
  3. 람다식은 우리가 마치 value 처럼 다를 수 있는 익명함수
  4. 형식 { parameter -> 내용}
  5. 람다 함수는 항상 { }으로 감싸서 표현
  6. {} 안에 "->" 표시가 있으며 "->" 왼쪽은 매개변수, 오른쪽은 함수 내용
  7. 매개변수는 ( )로 감싸지 않음
  8. 매개변수 타입을 선언해야 하며 예상 가능할때 생략 가능
  9. 함수의 반환값은 함수 내용의 마지막 표현식
  10. 함수의 맨 마지막 인자가 람다라면 () 안에서 빼내서 밖에 람다를 표현할 수 있음
  11. 인자가 하나라면 그 인자는 람다식 내부에서 it으로 받을 수 있음
  12. 인자가 하나이면서 그 인자가 람다타입 이라면 ()를 생략가능
  • 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