Skip to content

단일 요소 가져오기

Kotlin 컬렉션은 컬렉션에서 단일 요소를 가져오는 함수 집합을 제공합니다. 이 페이지에서 설명하는 함수는 리스트와 집합 모두에 적용됩니다.

리스트의 정의에서 설명하듯이, 리스트는 순서 있는 컬렉션입니다. 따라서 리스트의 모든 요소는 참조에 사용할 수 있는 위치를 가집니다. 이 페이지에서 설명하는 함수 외에도, 리스트는 인덱스를 통해 요소를 가져오고 검색하는 더 다양한 방법을 제공합니다. 자세한 내용은 리스트 전용 연산을 참조하세요.

반면에, 집합은 정의상 순서 있는 컬렉션이 아닙니다. 하지만 Kotlin의 Set은 특정 순서로 요소를 저장합니다. 이는 삽입 순서(LinkedHashSet의 경우), 자연 정렬 순서(SortedSet의 경우), 또는 다른 순서일 수 있습니다. 집합 요소의 순서가 알려지지 않은 경우도 있습니다. 이러한 경우에도 요소는 어떤 식으로든 정렬되므로, 요소 위치에 의존하는 함수들은 여전히 결과를 반환합니다. 그러나 호출자가 사용된 Set의 특정 구현을 알지 못하는 한, 이러한 결과는 예측 불가능합니다.

위치로 가져오기

특정 위치에 있는 요소를 가져오기 위해 elementAt() 함수가 있습니다. 이 함수를 정수 인자와 함께 호출하면 주어진 위치의 컬렉션 요소를 받게 됩니다. 첫 번째 요소는 0 위치를 가지며, 마지막 요소는 (size - 1)입니다.

elementAt()는 인덱스 접근을 제공하지 않거나, 정적으로 제공되는 것으로 알려지지 않은 컬렉션에 유용합니다. List의 경우, 인덱스 접근 연산자 (get() 또는 [])를 사용하는 것이 더 관용적입니다.

kotlin

fun main() {
    val numbers = linkedSetOf("one", "two", "three", "four", "five")
    println(numbers.elementAt(3))    

    val numbersSortedSet = sortedSetOf("one", "two", "three", "four")
    println(numbersSortedSet.elementAt(0)) // elements are stored in the ascending order
}

컬렉션의 첫 번째 요소와 마지막 요소를 가져오는 데 유용한 별칭도 있습니다: first()last().

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")
    println(numbers.first())    
    println(numbers.last())    
}

존재하지 않는 위치로 요소를 가져올 때 예외를 방지하려면, elementAt()의 안전한 변형을 사용하세요:

  • elementAtOrNull()은 지정된 위치가 컬렉션 범위를 벗어날 때 null을 반환합니다.
  • elementAtOrElse()는 추가적으로 Int 인자를 컬렉션 요소 타입의 인스턴스에 매핑하는 람다 함수를 받습니다. 범위를 벗어나는 위치로 호출될 때, elementAtOrElse()는 주어진 값에 대한 람다의 결과를 반환합니다.
kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")
    println(numbers.elementAtOrNull(5))
    println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
}

조건으로 검색

first()last() 함수는 주어진 조건자와 일치하는 요소를 컬렉션에서 검색할 수 있도록 합니다. 컬렉션 요소를 테스트하는 조건자와 함께 first()를 호출하면, 조건자가 true를 반환하는 첫 번째 요소를 받게 됩니다. 마찬가지로, 조건자와 함께 last()를 호출하면 일치하는 마지막 요소를 반환합니다.

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.first { it.length > 3 })
    println(numbers.last { it.startsWith("f") })
}

조건자와 일치하는 요소가 없으면 두 함수 모두 예외를 발생시킵니다. 이를 방지하려면 firstOrNull()lastOrNull()을 대신 사용하세요. 이 함수들은 일치하는 요소가 없으면 null을 반환합니다.

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.firstOrNull { it.length > 6 })
}

다음 별칭들은 이름이 상황에 더 적합한 경우에 사용하세요:

kotlin

fun main() {
    val numbers = listOf(1, 2, 3, 4)
    println(numbers.find { it % 2 == 0 })
    println(numbers.findLast { it % 2 == 0 })
}

선택자로 가져오기

요소를 가져오기 전에 컬렉션을 매핑해야 하는 경우, firstNotNullOf() 함수가 있습니다. 이 함수는 두 가지 동작을 결합합니다:

  • 선택자 함수로 컬렉션을 매핑합니다.
  • 결과에서 첫 번째 non-null 값을 반환합니다.

firstNotNullOf()는 결과 컬렉션에 non-nullable 요소가 없는 경우 NoSuchElementException을 발생시킵니다. 이 경우 null을 반환하려면 대응하는 firstNotNullOfOrNull()을 사용하세요.

kotlin
fun main() {
    val list = listOf<Any>(0, "true", false)
    // Converts each element to string and returns the first one that has required length
    val longEnough = list.firstNotNullOf { item -> item.toString().takeIf { it.length >= 4 } }
    println(longEnough)
}

무작위 요소

컬렉션의 임의의 요소를 가져와야 하는 경우, random() 함수를 호출하세요. 이 함수를 인자 없이 호출하거나, Random 객체를 무작위성의 원천으로 사용하여 호출할 수 있습니다.

kotlin

fun main() {
    val numbers = listOf(1, 2, 3, 4)
    println(numbers.random())
}

비어 있는 컬렉션에서 random()은 예외를 발생시킵니다. 대신 null을 받으려면 randomOrNull()을 사용하세요.

요소 존재 여부 확인

컬렉션에 요소의 존재 여부를 확인하려면 contains() 함수를 사용하세요. 이 함수는 컬렉션 요소가 함수 인자와 equals()인 경우 true를 반환합니다. contains()in 키워드를 사용하여 연산자 형식으로 호출할 수 있습니다.

여러 인스턴스의 존재 여부를 한 번에 확인하려면, 이 인스턴스들의 컬렉션을 인자로 하여 containsAll()를 호출하세요.

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.contains("four"))
    println("zero" in numbers)
    
    println(numbers.containsAll(listOf("four", "two")))
    println(numbers.containsAll(listOf("one", "zero")))
}

또한, isEmpty() 또는 isNotEmpty()를 호출하여 컬렉션에 요소가 포함되어 있는지 확인할 수 있습니다.

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.isEmpty())
    println(numbers.isNotEmpty())
    
    val empty = emptyList<String>()
    println(empty.isEmpty())
    println(empty.isNotEmpty())
}