코틀린 강좌 #27 컬렉션 함수, 두번째 이야기!

Kotlin/기본 문법 · 2020. 12. 24. 16:06

테크과학! DiMo

 

테크과학! DiMo

개발자가 얘기하는 생활 속 IT기술에 대한 과학! 여러분이 몰랐던, 혹은 정확히 알지 못했던 IT 테크놀러지를 파드립니다! 좋은 영상을 위한 채널 후원, 투네이션을 통해서 해주세요! 후원링크 htt

www.youtube.com

 

 

개발 환경: play.kotlinlang.org


associateBy


객체에서 key를 추출하여 map으로 변환하는 함수

 

collection.associateBy{ it.name }

 

 

 

groupBy


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

 

 

partition


아이템에 조건을 걸어 두개의 컬렉션으로 나누어 줌. 두 컬렉션은 두 객체를 담을 수 있는 Pair라는 클래스 객체로 반환

 

되므로 각각의 컬렉션을 first, second로 참조하여 사용.

 

 

또는 Pair를 직접 받아줄수 있도록 변수 이름을 괄호 안에 두 개 선언해주면 각각의 변수 이름으로 받을 수 있다.

 

val (over2002, under2002) = collection.partition{ it.birthYear > 2002 }

 

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})
    println(personList.groupBy{it.name})
    
    val (over98, under98) = personList.partition{ it.birthYear > 1998}
	println(over98)
    println(under98)
    
}

Output:
{1992=Person(name=유나, birthYear=1992), 1996=Person(name=조이, birthYear=1996), 1999=Person(name=츄, birthYear=1999), 2003=Person(name=유나, birthYear=2003)}
{유나=[Person(name=유나, birthYear=1992), Person(name=유나, birthYear=2003)], 조이=[Person(name=조이, birthYear=1996)], 츄=[Person(name=츄, birthYear=1999)]}
[Person(name=츄, birthYear=1999), Person(name=유나, birthYear=2003)]
[Person(name=유나, birthYear=1992), Person(name=조이, birthYear=1996)]

 

 

flatMap


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

 

collection.flatMap{ listOf(it * 3, it + 3)} 


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

 


getOrElse


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

 

collection.getOrElse() { } 

 


zip


컬렉션 두 개의 아이템을 1:1로 매칭하여(Pair 클래스의 객체로 만들어 리스트에 넣어) 새 컬렉션을 만들어 줌. 이 때 결과

 

List의 아이템의 갯수는 더 작은 컬렉션을 따라가게 됨.

 

collectionA zip collectionB 

 

fun main() {
	val numbers = listOf(-3, 7, 2, -10, 1)
    
    println(numbers.flatMap { listOf(it * 10, it + 5)})
    
    println(numbers.getOrElse(1){50})
    println(numbers.getOrElse(10){50})
    
    val names = listOf("A", "B", "C", "D")
    println(names zip numbers)
}

Output:
[-30, 2, 70, 12, 20, 7, -100, -5, 10, 6]
7
50
[(A, -3), (B, 7), (C, 2), (D, -10)]