고차함수와 람다식
2024. 4. 30. 20:48ㆍTIL
✔오늘 알게된 중요한 🔑 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 |