조용한 담장

코틀린(Kotlin) Collections : Operations Overview 본문

kotlin

코틀린(Kotlin) Collections : Operations Overview

iosroid 2020. 1. 2. 18:54

코틀린의 operation 에 대해 살펴보자.

원문 https://kotlinlang.org/docs/reference/collection-operations.html 을 보며 정리.

 

standard library 에 정의된 collection operation 은 collection interface 의 member functions 와 extension functions 로 되어 있다.

member functions 은 isEmpty(), get() 같은 collection type 의 필수적인 동작이 구현되어 있다.

자신의 collection interface 를 구현하고자 한다면 member function 은 반드시 구현해야 한다.

쉬운 방법은 collection interface 의 골격이 되는 클래스로 부터 구현하면 되는데, AbstractCollection, AbstractList, AbstractSet, AbstractMap 와 mutable 에 해당하는 클래스들 같은 것들이다.

extension functions 으로는 filtering, transformation, ordering 등이 구현되어 있다.

Common operations

공통 동작은 read-only 와 mutable collection 에 모두 적용된다.

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

collection 의 값에 영향을 주지 않고 결과를 리턴하는 동작들 이다.

동자의 결과는 변수에 저장되거나 다른 방식으로 쓰여야 한다.

val numbers = listOf("one", "two", "three", "four")  
numbers.filter { it.length > 3 }  // nothing happens with `numbers`, result is lost
println("numbers are still $numbers")
val longerThan3 = numbers.filter { it.length > 3 } // result is stored in `longerThan3`
println("numbers longer than 3 chars are $longerThan3")

특정 동작의 경우 destination object 를 지정할 수 있는 옵션이 있다.

destination 은 새로운 object 로 결과를 리턴하는 대신 결과 아이템을 추가할수 있는 mutable collection 이다.

To 를 postfix 로 가진 함수로 구분할 수 있는데, filter() 대신 filterTo() 또는 associate() 대신 associateTo() 들이 있다.

이런 함수들은 destination collection 을 추가적인 파라미터로 받는다.

val numbers = listOf("one", "two", "three", "four")
val filterResults = mutableListOf<String>()  //destination object
numbers.filterTo(filterResults) { it.length > 3 }
numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
println(filterResults) // contains results of both operations

// output:
// [three, four, one]

편의를 위해 이런 함수들은 destination collection 을 다시 리턴하는데, 이를통해 함수 호출문의 argument 에서 바로 생성하는 방법으로 사용할 수 있다.

val numbers = listOf("one", "two", "three", "four")
// filter numbers right into a new hash set, 
// thus eliminating duplicates in the result
val result = numbers.mapTo(HashSet()) { it.length }
println("distinct item lengths are $result")

// output:
// distinct item lengths are [3, 4, 5]

destination 을 가지는 함수들은 filtering, association, grouping, flattening 등등 에서 사용 가능하다.

Write operations

mutable collection 은 collection state 를 변경하는 write 동작들을 가지고 있다.

adding, removing, updating 이 해당된다.

특정 동작을 위해 같은 동작을 수행하기 위한 함수 페어가 있다.

하나는 해당 위치에서 수행되고 다른것은 다른 collection 으로 결과를 리턴한다.

예를 들어 sort() 는 mutable collection 을 그 자리에서 정렬하고 state 가 변한다.

sorted() 는 정렬된 순서의 결과를 가진 새로운 collection 을 생성한다.

val numbers = mutableListOf("one", "two", "three", "four")
val sortedNumbers = numbers.sorted()
println(numbers == sortedNumbers)  // false
numbers.sort()
println(numbers == sortedNumbers)  // true

 

Comments