Iterable
과 Sequence
는 비슷하지만 완전 다른 형태로 동작한다.Sequence
는 지연 처리되는데 데코레이터 패턴으로 꾸며진 새로운 시퀸스가 리턴되어 toList
등의 최종 연산이 이루어질 때 연산이 수행된다.
Iterable
는 연산이 이루어질 때마다 List
가 만들어진다.sequenceOf(1, 2, 3)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// 출력: F1, M1, E2, F2, F3, M3, E6,
listOf(1, 2, 3)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// 출력: F1, F2, F3, M1, M3, E2, E6
(1..10).asSequence()
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.find { it > 5 }
// 출력: F1, M1, F2, F3, M3,
(1..10)
.filter { print("F$it, "); it % 2 == 1 }
.map { print("M$it, "); it * 2 }
.find { it > 5 }
// 출력: F1, F2, F3, F4, F5 ... M1, M3, M5, M7, M9
generateSequence
또는 sequence
로 무한 시퀸스를 만들 수 있다.generateSequence(1) { it + 1 } // 초기값과 그 다음 요소의 계산 방법을 지정
.map { it * 2 }
.take(10)
.forEach { print("$it, ") }
// 출력: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
take
, first
등과 같은 종결 연산이 필요find
, any
, all
, none
, indexOf
도 무한을 끊을 순 있지만 원하는 요소를 못찾으면 무한 반복에 빠지니 지양해야 한다.sorted
가 있다.
sorted
의 경우 List
로 변환 후 자바 stdlib의 sort
를 사용한다.sorted
의 경우 무한 시퀸스와 함께 사용하면 무한 반복에 빠지니 주의해야 한다.