밍경송의 E.B
Android <2> More About Kotlin Functions 본문
---*function 2-5까지 내용 정리란-----
● list filter{condtion}
필터: 어떤 condition에 따라 list의 일부를 얻을 수 있는 방법.
⭐ 만약 파라미터가 하나라면,
1) -> 생략 가능
2) it이라는 키워드를 통해 파라미터 표현 가능
val ints = listOf(1,2,3,4)
ints.filter { n: Int -> n > 0 } //int형 n을 변수로 받아서 0보다 큰 조건을 만족하는 친구만 고르기
ints.filter { n -> n > 0 } // Int형이라는 것은 추론이 가능하기 때문에 생략 가능
ints.filter { it > 0 } // 파라미터가 하나이기 때문에 -> 생략 가능
: 아래 3가지 경우 모두 동일한 결과를 나타냄.
[예시]
fun main () {
val decorations = listOf("rock", "pagoda", "plastic plants", "alligator", "flowerpot")
println(decorations.filter { it[0] == 'p'})
}
: decorations list에 들어있는 친구들 중 'p'로 시작하는 단어를 출력하라는 함수
⭐ Filter의 경우 자동 iterate되기 때문에, it 안에 list에 담긴 친구들이 순서대로 돌아가며 들어감(모든 값을 다 돌 때까지).
list filter의 처리 방법
1)
Eager : filter을 쓸 때마다 필터링 작업 & 그에 따른 반환을 즉시 해줌. (*기본)
val decorations = listOf("rock", "pagoda", "plastic plants", "alligator", "flowerpot")
// eager, creates a new list
val eager = decorations.filter { it[0] == 'p'}
println("eager: $eager")
결과 => eager: [pagoda, plastic plants]
:리스트를 즉시 새로 만들어서 반환해줌
2)
Lazy : 필터링 작업은 지연 처리되고, 필요한 경우에만 반환해줌.
⭐Sequence : lazy evaluation때 사용하는 컬렉션 타입으로 lazy filter 사용시 필요함. (지연시키는..)
=> .asSequence().filter{ } (list (즉시) to Sequence(지연))
val decorations = listOf("rock", "pagoda", "plastic plants", "alligator", "flowerpot")
//lazy, will wait until asked to evaluate
val filtered = decorations.asSequence().filter { it[0] == 'p' }
println("filtered : $filtered")
결과 => filtered : kotlin.sequences.FilteringSequence@65b54208
: 아직 list를 만들지 않고 정보만 MEM에 저장한 상태
⭐Sequence를 다시 list로 변환하려면?
=> .toList() (Sequence(지연) to list(즉시))
val newList = filtered.toList()
println("new list: $newList")
결과 => eager: [pagoda, plastic plants]
✔️한 눈에 비교 ✔️
val decorations = listOf("rock", "pagoda", "plastic plants", "alligator", "flowerpot")
val lazyMap = decorations.asSequence().map { //list to Sequence
println("access: $it")
it
}
println("lazy: $lazyMap")
println("-----")
println("first: ${lazyMap.first()}")
println("-----")
println("all: ${lazyMap.toList()}")
결과=>
lazy: kotlin.sequences.TransformingSequence@33c7353a (.tolist() 전이기 때문에 list 생성 X)
-----
access: rock ↓ (lazyMap의 첫번째 요소를 호출했기 때문에 첫번째 요소만 access됨. 요소 전체 access X)
first: rock
-----
access: rock ↓ (.tolist()를 통해 Sequence를 list로 변환됐기 때문에 list가 생성되고, 모든 요소 access됨)
access: pagoda
access: plastic plants
access: alligator
access: flowerpot
all: [rock, pagoda, plastic plants, alligator, flowerpot]
*언제 lazy filter를 쓰는가?
1)엄청난 사이즈의 데이터 중 실사용하는 데이터는 몇 개 되지 않을 때
2) MEM 용량이 넉넉하지 않을 때
..
⭐ list 관련 다른 function들
1)
map() : list 안의 모든 요소에 동일한 transform을 수행 후 이를 반환해줌.
val numbers = setOF(11,22,33)
println(numbers.map{ it*3 })
결과=> [33, 66, 99]
2)
flatten() : 중첩된 list들의 요소를 모아서 단일 list로 반환해줌.
val numberSets = listOf(setOf(11,22,33), setOf(44,55), setOf(66,77))
println(numberSet.flatten())
결과=> [11, 22, 33, 44, 55, 66, 77]
3)
flatMap() : flat() + map() 의 기능을 모두 활용하는 함수도 있음.
&강의
https://developer.android.com/courses/pathways/android-development-with-kotlin-2?hl=ko
'GDSC > Android' 카테고리의 다른 글
Android <5> Layouts & Tip(팁) 계산기🔢 (0) | 2023.11.18 |
---|---|
Android <4> Build your first Android app: [Dice Roller🎲] (1) | 2023.11.17 |
Android <3> Classes and objects (1) | 2023.11.03 |
Android <2> Kotlin Functions - (Almost) Everything has a value! (0) | 2023.10.07 |
Android <1> Kotlin Basic - Benefits of Kotlin (0) | 2023.09.18 |