엔지니어 규의 IT 프로그래밍 다이어리

[Kotlin] 27. 컬렉션 함수(2) 본문

프로그래밍 언어/코틀린

[Kotlin] 27. 컬렉션 함수(2)

엔지니어 규 2022. 6. 2. 23:58
728x90

컬렉션함수(1) 보다 좀더 복잡한 기능의 컬렉션 함수를 알아보자.

 

 

 

associateBy : 객체에서 키를 따로 뽑아내서 map으로 만드는 함수이다. 

 

collection.associateBy{it.name}

 

예를들어 이름과 태어난해가 들어간 Person 객체가 있고, 이 객체들을 list 에  넣어놨을때,

이 list를 이름을 key 로하고 객체를  value 로 하는 Map으로 변경하려면

associateBy 에 중괄호안에 key로 사용할 이름 속성을 넣어주면 자동으로 Map으로 변환하여 반환한다.

 

 

 

groupBy : Key 가 같은 아이템끼리 배열로 묶어 map으로 만드는 함수

collection.groupBy{it.birthYear}

 

특정한 값을 key로 지정하여 해당값을 가진 객체끼리 묶은 배열을 value로 하는 Map을 만들어주는 기능이다.

 

 

 

partition : 아이템에 조건을 걸어 두개의 컬렉션으로 나누어 줌

collection.partition{it.birthYear > 2002 }

 

partition은 아이템에 조건을 걸어 true인지 false인지에 따라 두 컬렉션으로 나누어 준다.

두 컬렉션은 두객체를 담을 수 있는 Pair 라는 클래스 객체로 반환되므로 각각의 컬렉션을 first, second로 참조하여 사용할 수 있다.

 

또는 pair를 직접 받을수 있도록 변수이름을 괄호안에 두개 선언하면, 각각의 변수 이름으로 받을 수 있다.

 

 

아래의 코드를 통해 예시를 확인해 보자

 

fun main(){

   
data class Person(val name: String, val birthYear : Int)

       
val personList = listOf(
        Person(
"유나",1992),
       
Person("조이",1996),
       
Person("",1999),
       
Person("유나",2003))

   
println(personList.associateBy { it.birthYear })
   
/*{1992=Person(name=유나, birthYear=1992), 1996=Person(name=조이, birthYear=1996),
       1999=Person(name=
, birthYear=1999), 2003=Person(name=유나, birthYear=2003)}*/

   
println(personList.groupBy { it.name })
   
/*
    {
유나=[Person(name=유나, birthYear=1992), Person(name=유나, birthYear=2003)],
   
조이=[Person(name=조이, birthYear=1996)], =[Person(name=, birthYear=1999)]}
    */

   
val (over98,under98) = personList.partition { it.birthYear > 1998 }
   
println(over98)
   
/*
    [Person(name=
, birthYear=1999), Person(name=유나, birthYear=2003)]
    */
   
println(under98)
   
/*
    [Person(name=
유나, birthYear=1992), Person(name=조이, birthYear=1996)]
     */

   
val personList2 = personList.partition { it.birthYear > 1998 }
   
println(personList2.first)
   
/*
   [Person(name=
, birthYear=1999), Person(name=유나, birthYear=2003)]
    */
   
println(personList2.second)
   
/*
   [Person(name=
유나, birthYear=1992), Person(name=조이, birthYear=1996)]
    */
}

 

조건에 맞는 결과가 출력되는것을 볼수 있다.

 

 

 

 

flatMap : 아이템마다 만들어진 컬렉션을 합쳐서 반환하는 함수

collection.flatMap{}

 

중괄호 안에서 아이템마다 새로운 컬렉션을 생성하면 이를 합쳐서 하나의 컬렉션으로 반환해준다.

 

 

getOrElse : 인덱스 위치에 아이템이 있으면 아이템을 반환하고 아닌 경우 지정한 기본값을 반환하는함수

collection.getOrElse(){}

 

괄호안에 지정한 인덱스에 객체가 존재하는 경우 해당 객체를 반환하고, 없는경우 중괄호안의 객체를 반환해준다.

 

 

 

zip : 컬렉션 두개의 아이템을 1:1로 매칭하여 새 컬렉션을 만들어 줌

 

collectionA zip collectionB

 

두 컬렉션에 포함된 아이템을 1:1로 pair class 에 객체로 만들어 list에 넣어 반환해 준다.

이때 결과 list의 아이템의 개수는 더 작은 컬렉션을 따라가게 된다.

 

 

 

아래 코드를 통해 확인해보자.

fun main(){
    
    val numbers= listOf(-3,7,2,-10,1)

    println(numbers.flatMap { listOf(it * 10, it + 10) })
    //[-30, 7, 70, 17, 20, 12, -100, 0, 10, 11]

    println(numbers.getOrElse(1){50}) //7
    println(numbers.getOrElse(10){50}) //50

    val names = listOf("A","B","C","D")

    println(names zip numbers) //[(A, -3), (B, 7), (C, 2), (D, -10)]
    
}

 

조건에 맞는 결과가 출력되는 것을 확인할 수 있다.

 

 

 

컬렉션 함수는 데이터의 조작을 더 수월하게 만들수 있는 다양한 기능을 갖고 있으므로,

컬렉션에 담긴 데이터를 다룰때는 이용해보는 것이 좋다.

728x90
Comments