•
Kotlin 표준 라이브러리에는 컬렉션의 일부를 검색하는 확장 함수들이 포함되어 있다.
•
이 함수들은 명시적으로 요소의 위치를 나열하거나 결과 크기를 지정하는 등 다양한 방법으로 결과 컬렉션의 요소를 선택할 수 있다.
Slice
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.slice(1..3)) // ["two", "three", "four"]
println(numbers.slice(0..4 step 2)) // ["one", "three", "five"]
println(numbers.slice(setOf(3, 5, 0))) // ["four", "six", "one"]
Kotlin
복사
•
slice() 함수는 주어진 인덱스에 따라 컬렉션 요소의 리스트를 반환한다.
•
인덱스는 범위 또는 정수 값의 컬렉션으로 전달할 수 있다.
Take and drop
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.take(3)) // ["one", "two", "three"]
println(numbers.takeLast(3)) // ["four", "five", "six"]
println(numbers.drop(1)) // ["two", "three", "four", "five", "six"]
println(numbers.dropLast(5)) // ["one"]
Kotlin
복사
•
처음 또는 마지막 요소부터 지정된 개수의 요소를 얻으려면 take() 또는 takeLast()를 사용하라.
•
take() 와 takeLast() 두 함수 모두 컬렉션 크기보다 큰 숫자를 전달하면 전체 컬렉션을 반환한다.
•
처음 또는 마지막 요소부터 지정된 개수의 요소를 제외한 요소를 얻으려면 drop() 또는 dropLast()를 사용하라.
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.takeWhile { !it.startsWith('f') }) // ["one", "two", "three"]
println(numbers.takeLastWhile { it != "three" }) // ["four", "five", "six"]
println(numbers.dropWhile { it.length == 3 }) // [three, four, five, six]
println(numbers.dropLastWhile { it.contains('i') }) // [one, two, three, four]
Kotlin
복사
•
조건문을 사용하여 취하거나 버릴 요소의 수를 정의할 수 있다.
◦
takeWhile()
▪
컬렉션의 처음부터 주어진 조건문에 맞지 않는 요소를 찾을 때까지 취한다.
▪
컬렉션 요소가 조건문에 맞지 않으면 결과는 비어있다.
◦
takeLastWhile()
▪
컬렉션의 마지막부터 주어진 조건문에 맞지 않는 요소를 찾을 때까지 취한다.
▪
컬렉션 요소가 조건문에 맞지 않으면 결과는 비어있다.
◦
dropWhile()
▪
컬렉션의 처음부터 주어진 조건문에 맞지 않는 요소를 찾을 때까지 버린다.
◦
dropLastWhile()
▪
컬렉션의 마지막부터 주어진 조건문에 맞지 않는 요소를 찾을 때까지 버린다.
Chunked
val numbers = (0..13).toList()
println(numbers.chunked(3)) // [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]
Kotlin
복사
•
컬렉션을 주어진 크기의 부분으로 나누려면 chunked() 함수를 사용하라.
•
이 함수는 단일 인자를 받아서 주어진 크기의 리스트들의 리스트를 반환한다.
•
첫 번째 청크는 첫 번째 요소부터 시작하여 크기만큼의 요소를 포함하고 두 번째 청크는 다음 크기만큼의 요소를 포함한다.
•
마지막 청크는 더 작은 크기를 가질 수도 있다.
val numbers = (0..13).toList()
println(numbers.chunked(3) { it.sum() }) // [3, 12, 21, 30, 25] (`it`는 원래 컬렉션의 청크)
Kotlin
복사
•
청크에 즉시 변환을 적용할 수도 있다.
Windowed
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.windowed(3)) // [["one", "two", "three"], ["two", "three", "four"], ["three", "four", "five"]]
Kotlin
복사
•
주어진 크기의 컬렉션 요소의 모든 가능한 범위를 검색하려면 windowed() 함수를 사용하라.
•
이 함수는 주어진 크기의 슬라이딩 윈도우를 통해 컬렉션을 본 것처럼 모든 윈도우를 반환한다.
•
chunked() 와 달리 windowed() 는 각 컬렉션 요소에서 시작하는 요소 범위를 반환한다.
val numbers = (1..10).toList()
println(numbers.windowed(3, step = 2, partialWindows = true)) // [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10], [10]]
println(numbers.windowed(3) { it.sum() }) // [6, 15, 24, 33, 30]
Kotlin
복사
•
windowed() 는 선택적 매개변수를 제공하여 더 많은 유연성을 제공한다.
◦
step : 두 인접한 윈도우의 첫 요소 간의 거리를 정의한다. (기본값은 1)
◦
partialWindows : 컬렉션 끝의 요소에서 시작하는 더 작은 크기의 윈도우를 포함한다.
•
반환된 범위에 즉시 변환을 적용할 수도 있다.
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.zipWithNext()) // [(one, two), (two, three), (three, four), (four, five)]
println(numbers.zipWithNext() { s1, s2 -> s1.length > s2.length}) // [false, false, true, false]
Kotlin
복사
•
두 요소 윈도우를 생성하려면 별도의 함수인 zipWithNext() 를 사용할 수 있다.
•
이 함수는 수신 컬렉션의 인접한 요소 쌍을 생성한다.
•
zipWithNext() 는 쌍으로 컬렉션을 나누지 않고 마지막 요소를 제외한 각 요소에 대해 Pair 를 생성한다.