일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 컬렉션 함수
- kotlin collection
- Kotlin Generic
- 컬렉션함수
- isNullOrBlank
- add view
- class
- 프로그래머스 #탐욕법 #큰수만들기 #join #python
- 코틀린 람다함수
- 코틀린 중첩클래스
- 코틀린 컬렉션함수
- 코틀린 제너릭
- 코틀린 data class
- lateinit
- 프로그래머스
- 코틀린 lateinit
- 코틀린
- 코틀린 문자열
- kotlin recyclerview
- Kotlin
- programmers # 프로그래머스 #큰수비교 #cmp_to_key()
- kakao blind
- 객체의 동일성
- 내용의동일성
- kotlin addview
- 해시
- 카카오 순위검색
- 코틀린 내부 클래스
- kotlin listview
- collection function
- Today
- Total
엔지니어 규의 IT 프로그래밍 다이어리
[Kotlin] 27. 컬렉션 함수(2) 본문
컬렉션함수(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)]
}
조건에 맞는 결과가 출력되는 것을 확인할 수 있다.
컬렉션 함수는 데이터의 조작을 더 수월하게 만들수 있는 다양한 기능을 갖고 있으므로,
컬렉션에 담긴 데이터를 다룰때는 이용해보는 것이 좋다.
'프로그래밍 언어 > 코틀린' 카테고리의 다른 글
[Kotlin] 28. 변수의 고급 기술. 상수, lateinit, lazy (0) | 2022.06.03 |
---|---|
[Kotlin] 26. 컬렉션 함수(1) (0) | 2022.06.02 |
[Kotlin] 25. Set 과 Map (0) | 2022.06.01 |
[Kotlin]24. Data class 와 Enum Class (0) | 2022.06.01 |
[Kotlin] 23. 중첩 클래스와 내부클래스 (1) | 2022.05.31 |