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) 함수입니다. reduce
와 fold
의 차이는 초기값이 있냐 없냐입니다. 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
이 됩니다.
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin] Data Class 이해하기 (0) | 2022.05.23 |
---|---|
[Kotlin] lateinit과 lazy란? - 지연 초기화를 통한 성능 개선 (0) | 2021.12.24 |
[Kotlin] 코틀린(kotlin)의 장단점은 무엇일까? (0) | 2021.11.19 |
[Kotlin] (번역, 요약) Clean Code with Kotlin (0) | 2021.09.01 |
댓글