tonykang22 / study

0 stars 0 forks source link

[Kotlin & Spring] 11. 람다로 프로그래밍하기 #120

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

람다로 프로그래밍하기

함수형 프로그래밍 정의



코틀린과 함수형 프로그래밍

함수를 값으로 사용하기

val func: () -> Unit = {}



val printHello: () -> Unit = { println("Hello") }

fun main() {
        val list = mutableListOf(printHello) 
        list[0]() // 함수 호출을 위해()를 써야한다.
}
// Hello



val list = mutableListOf(printHello)
val func = list[0]
func()

// Hello



val printHello: () -> Unit = { println("Hello") }

fun call(block: () -> Unit) {
    block()
}

fun main() {
  call(printHello)
}

// Hello



fun main() {
        val list = mutableListOf(printNo) // 컴파일 오류
}

fun printNo() {
        println("No!")
}



val printMessage : (String) -> Unit = { message : String -> println(message) }

// 타입 생략
val printMessage : (String) -> Unit = { message  -> println(message) }

// it 사용
val printMessage : (String) -> Unit = { println(it) }



val plus: (Int, Int) -> Int = { a, b -> a + b }

fun main() {
  val result = plus(1, 3)

  println(result)
}
// 4



fun main() {

        val list = listOf("a", "b", "c")

        val printStr: (String) -> Unit = { println(it) }
        forEachStr(list, printStr)
}

fun forEachStr(collection: Collection<String>, action: (String) -> Unit) {
        for (item in collection) {
                action(item)
        }
} 
// a 
// b 
// c



익명함수와 람다식

fun outerFunc(): () -> Unit {
        return fun() {
                println("이것은 익명함수!") 
        }
}

fun main() {
      outerFunc()()
}
// 이것은 익명함수!



fun outerFunc(): () -> Unit {
        return { println(이것은 람다함수!"") }
}



fun outerFunc(): () -> Unit { println("이것은 람다함수!") }



val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y}

// 최대로 생략했을 경우
val sum2: { x: Int, y: Int -> x + y}



fun main() {

        val list = listOf("a", "b", "c")

        // 제거
        // val printStr: (String) -> Unit = { println(it) }
        forEachStr(list) {
                println(it)
        }

}

fun forEachStr(collection: Collection<String>, action: (String) -> Unit) {
        for (item in collection) {
                action(item)
        }
}



fun main() {

        arg1 {
                it.length
        }

        arg2 { a, b ->
                a.length
                b.length
        }
}

fun arg1(block: (String) -> Unit) {}

fun arg2(block: (String, String) -> Unit) {}



람다 레퍼런스 사용하기

val callReference: () -> Unit = { printHello() }

callReference()
// Hello



val callReference = ::printHello

callReference()
// Hello



val numberList = listOf("1", "2", "3")
numberList.map { it.toInt() }.forEach{ println(it) }



numberList.map(String::toInt).forEach(::println)



유용한 함수형 라이브러리 애로우