# 요소 값 생성하기
package chap02.section1
/* 시퀀스(Sequence)
: 순차적인 컬렉션으로 요소의 크기를 특정하지 않고, 나중에 결정할 수 있는 특수한 컬렉션이다.
예를들어, 특정 파일에서 줄 단위로 읽어서 요소를 만들 때 해당 파일의 끝을 모르면 줄이 언제 끝날지 알 수 없는 경우가 있는데 이럴 때 사용할 수 있다.
* */
fun main() {
val nums : Sequence<Int> = generateSequence(1) { it + 1} // 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의
println(nums.take(10).toList()) // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 List 컬렉션으로 반환
val squares = generateSequence(1) {it+1}.map { it * it } // 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의 + map을 사용하여 제곱수 반환
println(squares.take(10).toList()) // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 List 컬렉션으로 반환
val oddSquares = squares.filter { it % 2 != 0 }
println(oddSquares.take(5).toList())
}
# 요소 값 가져오기
package chap02.section1
/* 메서드 체이닝의 중간 결과 생성하기
* 중간 연산 결과 없이 한 번에 끝까지 연산한 후 결과를 반환하려면 asSequence()를 사용할 수 있습니다. 특히 filter나 map을 메서드 체이닝해서
* 사용할 경우 순차적 연산이기 때문에 시간이 많이 걸릴 수 있지만 asSequence()를 사용하면 병렬 처리되기 때문에 처리 성능이 좋아진다.
* */
fun main() {
/* 단순 메서드 체이닝 */
val list1 = listOf(1,2,3,4,5)
val listDefault = list1
.map { println("map($it)"); it * it} // (1)
.filter { println("filter($it) "); it % 2 == 0 } // (2)
//println(listDefault)
/* asSequence()를 통해 가져오기 */
val listSeq = list1.asSequence()
.map { print("map($it) "); it * it } // (1)
.filter { println("filter($it) "); it % 2 == 0 } // (2)
.toList() // (3)
println(listSeq)
/**
* 여기서는 asSequence()를 사용한 다음 바로 map,filter를 이용하여 메서드 체이닝을 했다.
* 이때 1번 과정과 2번 과정만으로는 결과를 도출할 수 없습니다. 3번 과정에 의해 최종 결과를 List 목록으로 반환할 때,
* 모든 연산이 수행되고 결과물이 새로운 리스트인 listSeq에 지정됩니다.
* 결과를 보면 연속적으로 map과 filter가 각각 수행된 것을 알 수 있으며, 최종 결과는 toList()에 의해 만들어진 [4,16]입니다.
* map의 수행 결과를 새로운 List에 만들고 이것을 다시 짝수인지 판별해 리스트를 만드는 과정이 없어진 것 입니다. 따라서 시퀀스를 사용하면
* 요소의 개수가 많을 때 속도나 메모리 측면에서 좋은 성능을 낼 수 있습니다.
*/
}
# 시퀀스의 활용
package chap02.section1
fun main() {
// 시퀀스를 이용한 피보나치 수열
val fibonacci = generateSequence (1 to 1) { it.second to it.first + it.second }
.map { it.first }
println(fibonacci.take(10).toList())
// 시퀀스를 이용한 소수
val primes = generateSequence(2 to generateSequence (3) {it + 2}) {
val currSeq = it.second.iterator()
val nextPrime = currSeq.next()
nextPrime to currSeq.asSequence().filter { it % nextPrime != 0 }
}.map {it.first}
println(primes.take(10).toList())
/**
* 먼저 초기 시드 값은 2부터 시작하고 두 번째 pair 값은 람다식에서 Pair<Int,Sequence<Int>> 형태로 구성되었기 때문에
* 다시 한번 시퀀스를 생성하고 있습니다. 여기서는 시드 값 3을 사용했습니다. 이후 이 값에서 2씩 더해집니다.
* 현재 시퀀스의 값과 다음 소수의 값이 나누어 떨어진 값이 0이 아닌 경우를 골라내어 소수를 구성하고 있습니다.
*/
}
'Kotlin' 카테고리의 다른 글
Kotlin - 클로저★ (0) | 2022.06.21 |
---|---|
Kotlin - 람다식과 고차함수(review) ★ (0) | 2022.06.21 |
Kotlin - 컬렉션의 확장 함수 (0) | 2022.06.21 |
Kotlin - 컬렉션 (0) | 2022.06.21 |
Kotlin - 배열 (0) | 2022.06.20 |