generateSequence()로 생성
// 시드 값 1을 시작으로 1씩 증가하는 시퀀스 정의
val nums: Sequence<Int> = generateSequence(1) {
it + 1
}
println(nums.take(10).toList())
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
take(10)을 통해서 10개 만큼 요소가 저장되고, toList()를 통해서 List컬렉션으로 반환된다.
val squares = generateSequence(1) {
it + 1
}.map { it * it }
println(squares.take(10).toList())
// [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
메소드 체이닝의 중간 결과 생성
시퀀스를 사용하지 않은 메소드 체이닝
val list6 = listOf(1, 2, 3, 4)
val listDefault = list6.map {
println("map : ${it}"); it * it
}
.filter {
println("filter : ${it}"); it % 2 == 0
}
println("listDefault : ${listDefault}")
// map : 1
// map : 2
// map : 3
// map : 4
// filter : 1
// filter : 4
// filter : 9
// filter : 16
// listDefault : [4, 16]
asSequence()를 통해 가져오기
val listSeq = list6.asSequence()
.map {
println("map : ${it}"); it * it
}
.filter {
println("filter : ${it}"); it % 2 == 0
}.toList()
println("listSeq : ${listSeq}")
// map : 1
// filter : 1
// map : 2
// filter : 4
// map : 3
// filter : 9
// map : 4
// filter : 16
// listSeq : [4, 16]
asSequence()를 사용한 다음 바로 map,filter를 이용하여 메소드 체이닝을 했다.
.filter와 .map으로는 결과를 만들어 낼 수 없고, 마지막 toList()를 통해서 결과를 List를 반환할 때 모든 연산이 수행되고 결과물이 새로운 리스트인 listSeq에 지정된다.
아까와 다르게 병렬처리 이기때문에 결과가 동시에 수행되면서 나옴