일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Swift
- docker
- union
- class component
- AWS
- Service
- react native
- Foreign Key
- function
- LiveData
- collection
- recyclerview
- elementAt
- vuex
- ConstraintLayout
- animation
- docker-compose
- Filter
- lifecycle
- Kotlin
- list
- MINUS
- Interface
- ReactNative
- map
- mongoose
- Generic
- enum
- 생명주기
- CLASS
- Today
- Total
개발 일기
Sequences 본문
Sequences
Collection에서 확장 함수일 경우에는 각각의 확장함수를 호출을 할 때마다
새로운 Collection이 생성되어 반환이 됩니다.
따라서 아래와 같이 생성이 됩니다.
val list = listOf(1, 2, 3) // [1, 2, 3] 생성
val maxOddSquare = list
.map { it + 1 }// [2, 3, 4] 생성
.filter { it % 2 == 1 } // [3] 생성
이러한 퍼포먼스 이슈를 피하기 위해서 Kotlin에서는 Sequence을 통해서 해결할수가 있습니다.
Sequence는 (lazy evaluation) 이여서 실제로 결과값이 필요한 시점에 연산을 수행합니다.
또한 아래와 같이 ".asSequence()" 을 통해서 변경을 할수 있습니다.
하지만 Return 값도 sequence이기 때문에 결과값을 원하는 값으로 변경을 해야합니다.
val list = listOf(1, 2, 3)
val maxOddSquare = list
.asSequence()
.map { it + 1 }
.filter { it % 2 == 1 }
.toList()
Constructing
sequence를 sequenceOf을 통해서 생성할수가 있습니다.
val numbersSequence = sequenceOf("four", "three", "two", "one")
From function
위에서는 asSequence()을 통해서 변환했다면 이제는 generateSequence()을 통해서 생성할수가 있습니다.
첫번째 매개변수로 초기값(seed)을 지정합니다. 두번째로 lambda 함수를 통해서 seed를 변환하고 무한히 반복하여 원소를 생성합니다.
따라서 최종 결과물이 유한한 상태로 제한을 통해 해결을 할수가 있습니다.
만약에 sequence generation을 멈추고 싶은 경우에는 return null 을 통해 멈출수가 있습니다.
val oddNumbers = generateSequence(1) {
if (it == 4) null else it + 1
} // `it` is the previous element
println(oddNumbers.take(5).toList())
//[1, 2, 3, 4]
만약에 sequence generation을 return null을 통해 멈추지 않을 경우에는 무한히 반복을 하기 때문에 다음과 같이 count을 통해서 접근하면 에러가 발생합니다.
val oddNumbers = generateSequence(1) {
it + 1
} // `it` is the previous element
println(oddNumbers.take(5).toList()) // [1, 2, 3, 4, 5]
println(oddNumbers.count()) // Error - Count overflow has happened
From chunks
다음은 sequence을 통해서 여러개의 값을 통해서 진행을 할수가 있습니다.
sequence에 lambda 안에서는 yield() , yieldAll() 통해 여러개의 값을 가질수가 있습니다.
yield() 같은 경우에는 single element
yieldAll() 같은 경우에는 Iterable , Sequence에 해당합니다.
sequence는 suspend로 작동을 합니다.
따라서 다음과 같습니다.
val oddNumbers = sequence {
yield(1)
yieldAll(generateSequence(2) {
println("--------두번째 실행---------")
if(it == 6) null else it + 1 }
)
yieldAll(generateSequence(7) {
println("--------세번째 실행---------")
it + 1 })
}
println(oddNumbers.take(10).toList())
}
--------두번째 실행---------
--------두번째 실행---------
--------두번째 실행---------
--------두번째 실행---------
--------두번째 실행---------
--------세번째 실행---------
--------세번째 실행---------
--------세번째 실행---------
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
'컴퓨터 언어 > kotlin' 카테고리의 다른 글
Filtering (0) | 2020.05.25 |
---|---|
Collection Transformations (0) | 2020.05.22 |
Ranges (0) | 2020.05.21 |
Iterators (0) | 2020.05.20 |
Constructing Collections (0) | 2020.05.19 |