Collection
- 컬렉션을 조작하는 모든 연산은
inline 함수다.
컬렉션 타입
- 타입은 기본적으로
Array,Iterable,Sequence,Map이 있다.

iterable
- 일반적으로
Iterable<T>으로 표현되며, 일반적으로 즉시 계산되는 상태가 있는 컬렉션을 포함한다. hasNext(),next()가 있다.remove()가 빠졌다.- java와 kotlin의 차이점은 불변/ 가변을 나눈다는 것이다.
collection, list, set
List
- ArrayList
- LinkedList
set
- LinkedHashSet
- TreeSet
sequence
- sequence 구현은 내부적이므로 외부에서 직접 사용할 수 없다. 대신 특별한 함수를 통해 시퀀스를 만들어야 한다.
- java의 stream과 비슷하다.
map
- key-value 쌍으로 이뤄진 집합
컬렉션 생성하기
- emptyList()/emptySet()
- listOf()/setOf()
- listOfNotNull()
- mutableListOf()/ mutableSetOf()
- arrayListOf()
- hashSetOf()/ linkedSetOf()/ sortedSetOf()
시퀀스 얻기
asSequence()/generateSequence()mapOf(1 to "one", 2 to "Two").asSequence().iterator().next() generateSequence(10) { it * it }- kotlin 1.3부터 특별한 빌더로 사용해서 시퀀스를 만들 수 있다.
- builder는 시퀀스 원소르 부분부분 지정한다.
SequenceScope가 수신 객체 타입인 확장 람다를 받는sequence()함수를 통해 빌더를 구현 할 수 있다.- yield(): 원소를 하나 시퀀스에 추가
- yieldAll(): 지정한 iterable, iterable, sequence에 있는 모든 원소를 시퀀스에 추가한다.
컬렉션에 대한 조건 검사
all()함수는 모든 원소가 주어진 술어를 만족하면 truenone()all()의 반대any()는 일부만 만족하면 된다.
집계
count()sum()sumOf{}average()minOrNull()maxOrNull()minByOrNull{}maxByOrNull{}minWithOrNull()maxWithOrNull()joinToString()reduce()reduceIndexed()fold()foldIndexed()
reduce vs. fold
- 초기 값을 커스텀할 수 있느냐 차이다.
- reduce는 초기값이 순회 대상의 첫 번째 요소
- fold는 java와 같이 지정할 수 있다.
필터링
filter()filterKeys()filterValues()filterInstance()filterNot()filterIndexed()filterIsInstance()filterNotNull()- 위 함수에서
~to가 붙은 버전이 존재한다. 이는 원본을 직접 수정하는 함수다. 위의 함수들은 필터링 후 불변 컬렉션을 만들어낸다.
변환
map()mapIndexed()mapNotNull()mapIndexedNotNull()mapKeys()mapValues()- 위의 함수에서 ~to가 붙은 버전은 원본을 수정하는 함수다. 위의 함수들은 변형 후 불변 컬렉션을 만들어낸다.
flatMap()flatMapTo()flatten():각각의 컬렉션을 이어 붙인 한 컬렉션을 내놓는다.flatMap()에 단순 변환을 적용한 것으로 볼 수 있다.println(listOf(listOf(1,2), setOf(3,4), listOf(5,6)).flatten())///[1,2,3,4,5]associateWith(): 변환 함수를 바탕으로 원본 컬렉션 원소를 맵의 키나 맵의 값으로 만들 수 있는 변환이다.println( listOf("red", "green", "blue" ).associateWith { it.length })// {red=3, green=5, blue=4}associateBy():associateWith()과 유사하지만 컬렉션 원소르 값으로 취급하고 변환함수를 통해서 키를 얻는다는 점이 다르다.println( listOf("red", "green", "blue" ).associateBy { it.length })// {3=red, 5=green, 4=blue}associate(): 직접 key, value를 정한다.println( listOf("red", "green", "blue" ).associate { it.length to it.uppercase() })// {3=RED, 5=GREEN, 4=BLUE}
하위 컬렉션 추출
subList()slice(): subList와 유사하고 원 컬렉션을 반영할 수 있는 래퍼 객체를 만들어 낸다.sliceArray(): 배열 원소를 다른 배열로 추출하고 싶다면sliceArray()를 사용하면 된다.take()/takeList(): 이터러블, 배열에서 우너소를 주어진 개수만큼 추출한다.drop()/dropLast(): take류의 연산을 반전시킨 연산이다.chunked(): 이터러블이나 시퀀스를 주어진 개수를 넘지 않는 작은 리스트들로 나눠준다.windowed(): 일정한 간격으로 청크를 연속적으로 얻어낸 slidingWindow를 얻을 수 있다.- slidingWindow의 규칙을 정할 수 있다.
- step: 서로 인접한 윈도우의 첫 번쨰 원소 사이의 거리
- partialWindow: 컬렉션의 마지막 부분에서 지정한 윈도우 크기보다 작은 크기의 윈도우를 포함시킬지 여부
- slidingWindow의 규칙을 정할 수 있다.
zipWithNext()val list = List(6){ it } list.zipWithNext() // [(0,1), (1,2), (2,3), (3,4), (4,5)]
순서
sorted()sortedBy()sortedWith()sortedDescending()sortedArray()sortedArrayDescending()