본문 바로가기
프로그래밍/Kotlin

[Kotlin] Kotlin Collection 관련 유용한 함수

by tempus 2021. 8. 28.
반응형

Android 개발을 하다 보면 필연적으로 collection이라는 자료구조를 많이 사용하게 됩니다. collection의 종류로는 List , Map, Set 이 있습니다.

Kotlin의 Collection은 기본적으로 Mutable과 Immutable을 별개로 지원합니다.

  • Mutable : 생성하면 추가, 삭제가 가능
  • Immutable : 생성하면 수정 불가

오늘은 이 collection에서 사용할 수 있는 유용한 함수들에 대해 정리해보려고 합니다.


🟩 sort

collection의 각 요소들을 정렬해줍니다.

fun main(args: Array<String>) {
    val a: MutableList<Int> = mutableListOf(3, 2, 1)

    a.sort() //a.sorted() 는 새로운 collection을 반환
    println(a)

    val sorted = a.sortedByDescending { it } // 내림차순
    println(sorted)

    //sortBy() : Object 의 특정 Property 들을 기준으로 정렬
    val list = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
    list.sortBy { it.second }
    println(list)
}

결과


🟩 map

collection의 각 요소들을 변형을 거쳐서 다른 collection으로 쉽게 복사할 수 있는 함수

fun main(args: Array<String>) {
  var a: List<Int> = listOf(1, 2, 3)

  var b = a.map {
    it * 2
  }
  println(b) 
}

결과


🟩 forEach

collection의 내부 인덱스 끝까지 알아서 순환하는 방법입니다. 보통 it이라는 키워드로 각각의 요소에 접근하여 사용합니다.

fun main(args: Array<String>) {
  var list = arrayOf(1, 2, 3, 4)
  list.forEach {
    println(it +1)
  }
}

결과


🟩 filter

조건에 맞는 요소만 collection으로 다시 묶어 반환해주는 함수입니다.

fun main(args: Array<String>) {
  var list = arrayOf(1, 2, 3, 4)
  var list2 = list.filter {
    it > 1
  }

  println(list2)
}

결과


🟩 find

조건에 맞는 첫 번째 요소를 반환한다. 없다면 null을 반환합니다. 이와 반대로 조건에 맞는 마지막 원소를 반환하는 것은 findLast가 있습니다.

fun main(args: Array<String>) {
    var list = arrayOf(1, 2, 3, 4)
    var list2 = list.find {
        it > 1
    }

    println(list2)
}

결과


🟩 any, all, none

collection의 요소를 모두 검사하여 해당 조건에 따라 Boolean을 반환하는 함수입니다.

fun main(args: Array<String>) {
    var a: List<Int> = listOf(1, 2, 3)

    if (a.any{ it==2 }) {
        println("any: 하나라도 조건에 맞으면 true를 반환")
    }

    if (a.all{ it is Int }) {
        println("all: 모두 조건에 맞으면 true를 반환")
    }

    if (a.none{ it > 4 }) {
        println("none: 하나도 조건에 맞지 않으면 true를 반환")
    }
}

결과


🟩 flatMap

아이템마다 원하는 컬렉션을 만들고 합쳐서 반환하는 함수입니다.

fun main(args: Array<String>) {
    var nums: List<Int> = listOf(1, 3, 5)

    var flat = nums.flatMap {
        listOf(it * 1, it + 5, it*9)
    }

    println(flat)
}

결과


🟩 partition

아이템에 조건을 걸어 true인지 flase인지에 따라 2개의 collection으로 나누어주는 함수 (true : first로 참조, false : second로 참조)

fun main(args: Array<String>) {

    var people: List<Person> = listOf(Person("hun", 12),
        Person("jae", 24),
        Person("jin", 36))
    var pair = people.partition{ it.age > 20 }

    println("* first")
    pair.first.forEach { println("${it.age} ${it.name}") }
    println("* second")
    pair.second.forEach { println("${it.age} ${it.name}") }

}

class Person(val name: String, var age: Int)

결과


🟩 getOrElse

collection안에서 해당 index에 값이 존재할 경우, 해당 값을 반환하고 없을 경우 중괄호 값 반환

fun main(args: Array<String>) {

    var a  : List<Int> = listOf(1, 3, 5)

    println(a.getOrElse(2) {10}) //a[2] 존재하므로 5 반환
    println(a.getOrElse(5) {10}) //a[5] 존재하지 않으므로 10 반환

}

결과


🟩 reduce & fold

collection 내의 데이터를 모두 모으는(accumulate) 함수입니다. reducefold의 차이는 초기값이 있냐 없냐입니다. fold의 경우 초기값을 설정할 수 있습니다. reduce는 첫 번째 요소를 acc로 사용되고 두 번째 요소 이후 계속 연산을 합니다.

fun main(args: Array<String>) {

    var nums: List<Int> = listOf(1, 3, 5)

    println("reduce : " + nums.reduce { acc, i -> acc+i *2 }) 
    println("fold : "  + nums.fold(0){acc,i -> acc+i *2})

}

결과


  • reduce의 경우 {acc : 1, i : 3} => 1 + 3 * 2 = 7 , {acc : 7 , i : 5 } => 7 + 5 * 2 = 17 이 되고
  • flod의 경우 {acc : 0 , i : 1} => 0 + 1 * 2 = 2 , {acc : 2 , i :3 } => 2 + 3* 2 = 8 , {acc : 8 , i : 5}=> 8 + 5 *2 = 18이 됩니다.
반응형

댓글


loading