코틀린 언어 정리 4-3

Collection operations

Common operations( 일반적인 연산들 )

Transformations ( 변환 )

Mapping

컬렉션의 모든 요소들에 각각 map 연산을 적용한 결과를 순서 변경 없이 그대로 컬렉션으로 생성하여 리턴 합니다.

map, mapIndexed, mapNotNull, mapIndexedNotNull


예제

//fun main ( args: Array<String> ) {

fun test () {

   var list = listOf( 10, 2, 30, 40, 5, 6, 7 )

   println(list)

   var list_smallNumber = list.map { if ( it >= 10 ) it/10 else it }

   println(list_smallNumber)

   var list_indexMinus = list_smallNumber.mapIndexed { index, it -> it - index }

   println(list_indexMinus)

   var list_40toNull = list.mapNotNull { if ( it == 40 ) null else it }

   println(list_40toNull)

   var list_index2toNull = list.mapIndexedNotNull { index, it ->

       if ( index == 2 ) null else index

   }

   println(list_index2toNull)

}


Zipping

두 개의 컬렉션의 index가 동일한 각각의 요소들을 Pair 로 만든 후 이를 요소로 하는 컬렉션을 생성합니다.(zip 연산) 역으로 Pair를 요소(element)로 하는 컬렉션을 두 개의 컬렉션으로 나누어 생성 할 수도 있습니다.(unzip 연산)

zip, unzip


예제

//fun main ( args: Array<String> ) {

fun test () {

   var list_eng = listOf("dog", "cat", "pig", "cow")

   var list_kor = listOf("개", "고양이", "돼지")

   var list_zipped = list_eng zip list_kor // 컬렉션 개수가 일치하지 않는 경우 모자라는 쪽의 개수에 맞추어 zip collection 생성

   println(list_zipped)

   var (list_unzipped_eng, list_unzipped_kor) = list_zipped.unzip()

   println(list_unzipped_eng)

   println(list_unzipped_kor)

}



Association

컬렉션의 각각의 요소에 association 연산을 적용 후 원본 요소와 원본 요소에 적용한 association 연산 결과값의 Pair를 요소로 하는 Map(key, value pair)을 생성합니다. Map 컬렉션은 key 값의 중복을 허용하지 않으므로, 만약 중복되는 원본 요소가 있는 경우 마지막 원본 요소만 유지됩니다.

associateWith

Pair(원본 요소, association 연산 결과값) 를 요소로 하는 컬렉션 생성

associateBy

Pair(association 연산 결과값, 원본 요소) 를 요소로 하는 컬렉션 생성

associate

Pair를 리턴하며 key와 value는 원하는 아무 것(연산을 수행하는 컬렉션과 전혀 관련 없는 값도 가능. 단 값의 타입은 동일해야 함)이나 지정할 수 있습니다.


예제

fun test () {

   var list_kor = listOf("개", "고양이", "토끼", "말", "염소")

   var list_eng = listOf("dog", "cat", "rabbit", "horse", "goat")

   println(list_kor)

   println(list_eng)

   var nIdx = 0

   var map_associateWith = list_kor.associateWith { list_eng[nIdx++] } // return -> value, key: list_kor[n], value: list_eng[n]

   println(map_associateWith)

   nIdx = 0

   var map_associateBy = list_kor.associateBy { list_eng[ nIdx++ ]} // return -> key, key: list_eng[n], value: list_kor[n]

   println(map_associateBy)

   nIdx = 0

   var map_associate = list_kor.associate { it -> if ( 0 == (nIdx % 2) ) it to list_eng[ nIdx++ ] else Pair( list_eng[ nIdx++ ], it ) } // return -> Pair(key, value), key: anything, value: anything

   println(map_associate)

}


Flattening

컬렉션이 중첩된 컬렉션 일 경우 사용할 수 있는 연산입니다. 컬렉션의 요소로 추가되어 있는 하위 컬렉션들의 모든 요소들을 새로운 컬렉션의 요소로 추가하여 리턴합니다. 예를 들면 아래와 같습니다. 최상위 컬렉션 A와 A의 요소로 추가된 B-1, B-2, ... B-N 컬렉션이 있다고 가정하면 B-1의 모든 요소, B-2의 모든 요소, ..., B-N의 모든 요소를 새로운 컬렉션의 요소로 추가하여 리턴합니다.

flatten

매개변수가 없으며 호출하면 Flattening을 수행합니다.( 새로운 컬렉션 리턴 )

flatMap

람다함수를 인자로 전달 받으며, flatten 함수와 기본적인 동작은 비슷합니다. flatMap 함수 내에서 람다함수는 리시버의 요소인 컬렉션들의 개수 만큼 실행 되며 이 람다함수에서 리턴(마지막 표현식)하는 컬렉션의 요소들을 새로운 컬렉션에 추가하여 리턴합니다. flatten 함수와의 차이점은, 람다함수에서 리턴하는 컬렉션(리턴값은 모두 컬렉션 이어야 합니다.)에 다른 연산(변환 등)을 적용할 수 있다는 점입니다. 예를 들어, 중첩된 컬렉션 구조의 중간에 호환되지 않는 컬렉션 비슷한 객체가 있을 경우 이 객체에서 호환되는 컬렉션을 제공 받거나 또는 생성하여 flatMap 연산을 완료할 수 있습니다.

주의

flatten, flatMap 함수 모두 중첩된 컬렉션에 대해 1차적으로만 Flattening을 수행합니다. 재귀적으로 Flattening을 수행하지 않으므로 3차 이상의 다중 중첩 컬렉션일 경우 연산을 여러번 적용해야 합니다. 만약 flatMap을 호출한 컬렉션의 요소 중 컬렉션이 아닌 것이 하나 이상 포함되어 있다면( 예를 들면 0번째 요소는 List 인데 1번째 요소는 Int형 숫자인 경우 ) 컴파일 에러가 발생합니다.


예제

fun test() {

   var list_nested = listOf(

       listOf(

           listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9)

       ),

       listOf(

           listOf(10, 20, 30), listOf(40, 50, 60), listOf(70, 80, 90)

       )

   )

   println(list_nested)


   var list_flatten_1 = list_nested.flatten()

   println(list_flatten_1)

   var list_flatten_2 = list_flatten_1.flatten()

   println(list_flatten_2)


   var list_flatMap_1 = list_nested.flatMap { println("it:$it");it }

   println(list_flatMap_1)


   var list_flatMap_2 = list_nested.flatMap {

       var list_addSome_flatten = listOf(1000, 2000, "String...3000")

       list_addSome_flatten + it.flatten()

   }

   println(list_flatMap_2)

}



String representation

컬렉션의 요소들을 읽을 수 있는 형식(문자열)로 반환할 수 있는 기능입니다. joinTo 는 기존의 문자열 버퍼 뒤에 컬렉션의 문자열을 추가한다는 점을 제외하면 joinToString 과 동일합니다.


joinToString( separator, prefix, postfix, limit, truncated, transform )
joinTo( buffer, separator, prefix, postfix, limit, truncated, transform )


예제

fun test() {

   var list = listOf("a", "b", "c", "d", "e")

   println(list.joinToString())

   println(list.joinToString(

       separator=" / ",

       prefix="start:::",

       postfix=":::end",

       limit=3,

       truncated="...",

       transform= { it.toUpperCase() }

   ))


   var tmpStr1 = StringBuffer("fullString: abcde => ")

   var tmpStr2 = StringBuffer("fullString: abcde => ")

   println(list.joinTo(tmpStr1))

   println(list.joinTo(

       buffer=tmpStr2,

       separator="/",

       prefix="start:::",

       postfix=":::end",

       limit=4,

       truncated="..",

       transform= { it + it.toUpperCase() }

   ))

}


+ Recent posts