•
Kotlin 컬렉션들은 컬렉션에서 단일 요소를 검색하기 위한 함수 집합을 제공한다.
•
List의 정의에 따르면 List는 순서가 있는 컬렉션이므로 List의 각 요소는 참조할 수 있는 위치를 가지고 있다.
•
Set은 정의상 순서가 없는 컬렉션이지만 Kotlin의 Set은 특정한 순서(LinkedHashSet에서 삽입 순서, SortedSet에서 자연 정렬 순서, 또는 다른 순서)로 요소를 저장하므로 요소의 순서가 불확실할 경우에도 요소들은 여전히 어떤 방식으로든 정렬되어 있기 때문에 요소의 위치에 의존하는 함수는 여전히 결과를 반환한다.
위치로 검색하기
val numbers = linkedSetOf("one", "two", "three", "four", "five")
println(numbers.elementAt(3))
val numbersSortedSet = sortedSetOf("one", "two", "three", "four")
println(numbersSortedSet.elementAt(0)) // 요소는 오름차순으로 저장됨
Kotlin
복사
•
특정 위치에서 요소를 검색하기 위해 elementAt() 함수를 사용하라.
•
이 함수에 정수 번호를 인자로 전달하면 해당 위치의 컬렉션 요소를 얻을 수 있다.
•
첫 번째 요소는 위치 0을 가지며 마지막 요소는 (size - 1)이다.
•
elementAt() 은 인덱스 접근을 제공하지 않거나 정적으로 알려지지 않은 컬렉션에 유용하다.
•
List의 경우 인덱스 접근 연산자(get() 또는 [])를 사용하는 것이 더 관용적이다.
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.first())
println(numbers.last())
Kotlin
복사
•
컬렉션의 첫 번째 및 마지막 요소를 검색하는데 유용한 first() 와 last() 도 있다.
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.elementAtOrNull(5))
println(numbers.elementAtOrElse(5) { index -> "인덱스 $index의 값은 정의되지 않음"})
Kotlin
복사
•
존재하지 않는 위치에서 요소를 검색할 때 예외를 피하려면 elementAt() 의 안전 변형을 사용하라.
◦
elementAtOrNull() : 지정한 위치가 컬렉션의 경계를 벗어났을 경우 null을 반환한다.
◦
elementAtOrElse() : 지정한 위치가 컬렉션의 경계를 벗어났을 경우 주어진 값에 대한 람다의 결과를 반환한다.
조건으로 검색하기
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.first { it.length > 3 })
println(numbers.last { it.startsWith("f") })
Kotlin
복사
•
first() 및 last() 함수는 주어진 조건에 맞는 요소를 검색할 수 있다.
•
조건이 참이 되는 첫 번째 요소를 반환하려면 first() 를 사용하고 마지막 요소를 반환하려면 last() 를 사용하라.
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.firstOrNull { it.length > 6 })
Kotlin
복사
•
조건에 맞는 요소가 없으면 두 함수 모두 예외를 발생시킨다.
•
이를 피하려면 firstOrNull() 과 lastOrNull() 을 사용하라.
•
이 둘은 매칭되는 요소가 없을 경우 null을 반환한다.
val numbers = listOf(1, 2, 3, 4)
println(numbers.find { it % 2 == 0 })
println(numbers.findLast { it % 2 == 0 })
Kotlin
복사
•
이름이 더 적합한 경우 별칭을 사용할 수 있다.
◦
find() 는 firstOrNull() 대신 사용한다.
◦
findLast() 는 lastOrNull() 대신 사용한다.
선택자로 검색하기
val list = listOf<Any>(0, "true", false)
// 각 요소를 문자열로 변환하고, 필요한 길이를 가진 첫 번째 값을 반환합니다.
val longEnough = list.firstNotNullOf { item -> item.toString().takeIf { it.length >= 4 } }
println(longEnough) // true
Kotlin
복사
•
컬렉션을 매핑한 후 요소를 검색해야 하는 경우 firstNotNullOf() 함수를 사용한다.
•
이 함수는 두 가지 작업을 결합한다.
1.
선택자 함수로 컬렉션을 매핑한다.
2.
결과에서 첫 번째 null이 아닌 값을 반환한다.
•
firstNotNullOf() 는 결과 컬렉션에 null이 아닌 요소가 없을 경우 NoSuchElementException을 발생시킨다.
•
firstNotNullOfOrNull() 을 사용하면 이 경우 null을 반환한다.
무작위 요소 검색
val numbers = listOf(1, 2, 3, 4)
println(numbers.random())
Kotlin
복사
•
컬렉션에서 임의의 요소를 검색하려면 random() 함수를 호출한다.
•
인자 없이 호출하거나 난수 생성기 객체를 인자로 전달할 수 있다.
•
빈 컬렉션에서는 random() 이 예외를 발생시키므로 null을 받으려면 randomOrNull() 을 사용하라.
요소 존재 확인하기
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")))
Kotlin
복사
•
컬렉션에 요소가 존재하는지 확인하려면 contains() 함수를 사용한다.
•
이 함수는 주어진 인자와 같은 컬렉션 요소가 존재할 경우 true를 반환한다.
•
in 키워드를 사용해 연산자 형태로 contains() 를 호출할 수 있다.
•
여러 인스턴스의 존재를 동시에 확인하려면 containsAll() 을 호출하여 인스턴스의 컬렉션을 인자로 전달한다.
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())
Kotlin
복사
•
isEmpty() 또는 isNotEmpty() 를 호출하여 컬렉션에 요소가 있는지 확인할 수 있다.