Search

Retrieve collection parts

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 를 생성한다.