고차함수와 람다식

2024. 4. 30. 20:48TIL

✔오늘 알게된 중요한 🔑 point

  • 고차함수를 사용하면 코드의 추상화 수준을 높이기 때문에 코드를 이해하기 쉽고 유지보수 하기 쉽게 만들 수 있다.

🎯 오늘 연습한 내용

고차함수의 정의

고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수다.
특히 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다

 

 

map

컬렉션 내의 각 요소에 대해 주어진 함수를 적용-> 새로운 컬렉션을 생성

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)
    
    val multiplyNumbers=numbers.map{it*it}

    val multiplyNumbers2=numbers.map{it*10+20}

    println(multiplyNumbers)
    println(multiplyNumbers2)
}

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)

    val multiplyNumbers=numbers.map{
        if(it<2 || it>4){
            it+1000
        }
        else{
            it
        }
    }
    println(multiplyNumbers)
}

it은 각 리스트의 요소

 

fold

초기값과 함께 컬렉션 내의 요소에 대해 주어진 함수를 순차적으로 적용 -> 하나의 값 생성

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)

    val multiSum=numbers.fold(0){acc,num -> acc+num*num}
    println(multiSum)
}

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)

    val multiNumbers=numbers.fold(0){ acc,element->
        if(element>3){
            acc+element
        }
        else
            acc
    }
    println(multiNumbers)
}

acc는 값을 반환하기 위한 값, 누적값

element는 리스트의 각 요소

 

forEach

컬렉션 내의 각 요소에 대해 주어진 동작 수행 -> 반환값 없음

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)

    numbers.forEach{
        if(it%2==0) println(it)
    }
}

 

 

filter

컬렉션 내의 특정 조건을 만족하는 해당 요소 선택-> 새로운 컬렉션 생성

 

fun main() {
    val numbers=listOf(1,2,3,4,5,6)

    println(numbers.filter{it %2==0})
}

 

flatMap

컬렉션 내의 각 요소에 대해 주어진 함수 적용-> 여러개의 리스트를 하나의 리스트로 생성

 

fun main() {
    val words = listOf("sparta","flix","hj","park")
    println(words.flatMap{it.toList()})

    val wordsInt = listOf("1","2","3","4","5")
    println(wordsInt.flatMap{listOf(it.toInt())})
}

flatMap함수의 람다 표현식에서 각 요소를 변환하는 함수는 반드시 리스트를 반환해야함

 

 

zip

2개의 컬렉션을 인자로 받아 각 컬렉션의 동일한 인덱스에 위치한 요소들을 조합-> 새로운 컬렉션 생성

 

fun main() {
    val numbers= listOf(1,2,3,4)
    val words= listOf("첫번째","두번째","세번째","네번째")
    println(numbers.zip(words))
 }

zip함수는 두개의 컬렉션을 하나로 조합하는데 사용되기때문에 람다식을 직접 사용할 수 없다

 

 

any

컬렉션 내의 요소중 조건에 맞는 요소가 있는지 확인 -> true,false값 반환

 

fun main() {
    val numbers= listOf(1,2,3,4,5,6,7,8,9,10)
    println(numbers.any{it %2==1})
 }

 

단 하나의 요소만참이어도 true를 반환한다

 

all

컬렉션 내의 모든 요소가 조건에 맞는지 확인 -> true,false값 반환

 

fun main() {
    val numbers= listOf(1,2,3,4,5,6,7,8,9,10)
    println("1.${numbers.all{it %2==1}}")

    val numbers2=listOf(1,3,5,7,9,1001)
    println("2.${numbers2.all{it %2==1}}")
 }

any는 단 하나만 참이어도 true값을 반환하지만 all은 모든 요소가 참이어야 true값을 반환한다

 

 

🤔 어떻게 활용할까?

알고리즘 문제를 풀때 문자열을 split하고 리스트로 다시 바꾸고  그 값을 다시 변수에 할당하고 하는 식으로 복잡하게 코드를 작성했었는데 고차함수를 활용해서 간단하게 작성할 수 있게되어 코드의 가독성이 좋아짐을 기대할 수 있을것 같다

 

📓 오늘의 한줄

All we have to decide is what to do with the time that is given us

- John Ronald Reuel Tolkien-

 

 

'TIL' 카테고리의 다른 글

시간 복잡도  (0) 2024.05.02
git branch  (0) 2024.05.01
Enum class  (0) 2024.04.29
(알고리즘) 핸드폰 번호 가리기  (0) 2024.04.28
(알고리즘) 나누어 떨어지는 숫자 배열  (0) 2024.04.27