밍경송의 E.B

Android <2> More About Kotlin Functions 본문

GDSC/Android

Android <2> More About Kotlin Functions

m_gyxxmi 2023. 10. 14. 19:01

 

---*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 

 

2강: 함수  |  Android 개발자  |  Android Developers

Kotlin 프로그램을 만들고 매개변수의 기본값, 필터, 람다, 컴팩트 함수를 비롯하여 Kotlin의 함수에 관해 알아봅니다.

developer.android.com