컬렉션은 어떤 관련 항목에 대한 그룹이다. 이전에 학습한 목록 List도 컬렉션의 한 유형이다. 목록과 마찬가지로 컬렉션은 변경 가능한 컬렉션과 변경 불가능한 컬렉션으로 구분된다.
목록과 달리 중복될 수 없으며 순서는 중요하지 않다.
List를 Set으로 변환 toSet()
fun main() {
val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
println("list: ${numbers}")
val setOfNumbers = numbers.toSet()
println("set: ${setOfNumbers}")
}
// list: [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
// set: [0, 3, 8, 4, 5, 9, 2]
setOf, mutableSetOf
목록과 마찬가지로 수정 가능한 집합 MutableSet이 있다.
val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3,2,1)
contain()
, 교집합 연산 intersect()
, 합집합 연산 union()
함수 등을 사용할 수 있다.특정 키가 부여된 값을 쉽게 찾을 수 있도록 key-value
쌍으로된 집합이다. 키는 고유하고 정확히 하나의 값에 매핑되지만 값은 중복될 수 있다. 맵의 값은 문자열, 숫자, 객체일 수 있으며 목록 또는 집합과 같은 다른 컬렉션일 수도 있다.
fun main() {
val peopleAges = mutableMapOf<String, Int>(
"Fred" to 32,
"Ann" to 8
)
peopleAges.put("Barbara",42)
peopleAges["Joe"] = 13
println(peopleAges)
}
// {Fred=32, Ann=8, Barbara=42, Joe=13}
put()
을 사용하거나 map[key] = value
로 항목을 추가할 수 있다.컬렉션의 모든 항목을 탐색하면서 항목별로 작업을 실행할 때 forEach()
를 사용할 수 있다.
peopleAges.forEach{print("${it.key} is ${it.value}, ")}
// Fred is 32, Ann is 8, Barbara is 42, Joe is 13,
forEach
는 for
문처럼 항목의 변수를 지정하는 대신 특수 식별자 it
을 사용한다. forEach
메소드는 소괄호 없이 중괄호 안에 코드를 작성하면 된다.
컬렉션의 한 유형 맵이 아니라 map() 함수다. map() 함수는 컬렉션의 각 항목에 변환을 적용한다.
println(peopleAges.map{"${it.key} is ${it.value}"}.joinToString(", "))
// Fred is 32, Ann is 8, Barbara is 42, Joe is 13
forEach로 출력한 것과 달리 마지막에 쉼표가 사라진 것을 확인할 수 있다.
특정 조건과 일치하는 항목을 찾을 때 사용한다.
val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)
// {Ann=8, Joe=13}
LinkedHashMap
이다.peopleAges.forEach { print("${it.key} is ${it.value}") }
앞에서 본 이 코드를 보면 중괄호 안에 작은 함수를 작성하는 것이라고 볼 수 있다. 하지만 이 작은 함수에 이름은 없다. 이처럼 이름이 없고 곧바로 표현식으로 사용할 수 있는 함수는 람다 표현식
으로 나타낼 수 있다.
Function Type
아래 코드를 실행하면 15가 출력된다.
fun main() {
val triple: (Int) -> Int = { a: Int -> a * 3 }
println(triple(5))
}
(Int) -> Int
: Function Type{ a: Int -> a * 3 }
: Lambda특수 식별자 it
을 사용해 더 짧게 작성할 수 있다.
val triple: (Int) -> Int = { it * 3 }
고차 함수
함수를 다른 함수로 전달하거나 함수에서 함수를 반환하는 것이다.
앞에서 본 map
, filter
, forEach
함수 모두 고차 함수의 예이다.
sortedWith()
아래 코드처럼 람다를 이용해 정렬하는 기준을 정할 수 있다. 이 경우 이름의 길이 순으로 정렬된다. 그냥 sorted()를 사용했다면 사전순으로 정렬 되었을 것이다.
pplNames.sortedWith{str1: String, str2: String -> str1.length - str2.length }
다음 실습을 위해 단어 목록을 만들자.
fun main() {
val words = listOf("about", "acute", "awesome", "balloon", "best",
"brief", "class", "coffee", "creative")
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
.shuffled()
.take(2)
println(filteredWords)
}
filter
로 "b" 또는 "B"로 시작하는 단어를 골라내고shuffled()
로 순서를 섞고take(2)
로 2개만 가져온다.