Collection Operations


일반적인 컬렉션 연산들은 read-only, mutable 컬렉션 둘다 사용 가능하며 크게 아래와 같이 분류된다.

Transformations, Filtering, plus and minus operators, Grouping, Retrieving collection parts, Retrieving single elements, Ordering, Aggregate operations

오늘은 그중에서 Filtering 에 대해 정리해보았다.


Filtering

filter


람다 안의 조건에 맞는 요소 만을 담은 컬렉션을 반환

val numbers = listOf("one", "two", "three", "four")  
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
println(filteredMap)

// Output
// [three, four]
// {key11=11}


filterIndexed

filer 함수에서 인덱스를 사용할 수 있음

val numbers = listOf("one", "two", "three", "four")

val filteredIdx = numbers.filterIndexed { index, s -> (index != 0) && (s.length < 5)  }

println(filteredIdx)

// Output
// [two, four]


filterIsInstance

Any 타입의 컬렉션 중에서 특정 타입의 요소만을 컬렉션에 담아 반환

val numbers = listOf(null, 1, "two", 3.0, "four")
numbers.filterIsInstance<String>().forEach {
    println(it.uppercase())
}

// Output
// TWO
// FOUR


filterNotNull

List<T?> 형의 nullable 컬렉션에 사용하여 non-null 컬렉션 (List<T!!>)을 반환한다.

val numbers = listOf(null, "one", "two", null)
numbers.filterNotNull().forEach {
    println(it.length)   // length is unavailable for nullable Strings
}

//Output
// 3
// 3


Partition

filter 함수와 비슷하지만 matched 와 unmatched(rest) 두 부분으로 컬렉션을 나눈다.

val numbers = listOf("one", "two", "three", "four")
val (match, rest) = numbers.partition { it.length > 3 }

println(match)
println(rest)

// Output
// [three, four]
// [one, two]


Test predicates

컬렉션을 테스트 할 수 있는 3가지 함수들

  1. any() : 하나라도 조건에 충족한다면 true

  2. none() : 단 하나도 조건에 충족되지 못한다면 true

  3. all() : 모든 요소가 조건에 충족된다면 true

val numbers = listOf("one", "two", "three", "four")

println(numbers.any { it.endsWith("e") })
println(numbers.none { it.endsWith("a") })
println(numbers.all { it.endsWith("e") })
println(emptyList<Int>().all { it > 5 })   // vacuous truth, 빈 컬렉션이므로 통과되는 경우

// Output
// true
// true
// false
// true