코틀린 컬렉션 활용기

데이터 셋을 만들어보자

유저 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13

data class User(

var name : String = "",
var age : Int = 0



) {
override fun toString(): String {
return "User(name='$name', age=$age)"
}
}

샘플 데이터 생성

1
2
3
4
5
6
7
8
9
10
val users = listOf<User>(

User("pkj", 30),
User("beanbroker", 40),
User("A", 32),
User("B", 27),
User("C", 44),
User("D", 30)

)

1. filter

우리가 원하는 조건값에 맞는 리스트를 리턴한다

1
2
3
4
5
6
/**
* Returns a list containing only elements matching the given [predicate].
*/
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}

샘플코드

1
2
3
4
5

val listOfOverThirtyFive = users.filter { it.age > 35 }
println(listOfOverThirtyFive.toString())

결과 : [User(name=beanbroker, age=40), User(name=C, age=44)]

2. all

모든 데이터가 주어진 조건이 맞는지 안하는지 return true or fale

1
2
3
4
5
6
7
8
9
10
/**
* Returns `true` if all elements match the given [predicate].
*
* @sample samples.collections.Collections.Aggregates.all
*/
public inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean {
if (this is Collection && isEmpty()) return true
for (element in this) if (!predicate(element)) return false
return true
}

샘플코드

1
2
3
4
5
6
7
8
9
10
val isOlderThan50 = users.all { it.age > 50 }

println(isOlderThan50)

val isYoungerThan50 = users.all { it.age <50 }
println(isYoungerThan50)

결과
isOlderThan50 : false
isYoungerThan50 : true

만약 users.all { it.age <40 } 이면 false를 리턴 모든 조건을 충족해야하기 때문에

3. any

하나의 데이터라도 주어진 조건에 맞는다면 true를 리턴

1
2
3
4
5
6
7
8
9
10
/**
* Returns `true` if at least one element matches the given [predicate].
*
* @sample samples.collections.Collections.Aggregates.anyWithPredicate
*/
public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean {
if (this is Collection && isEmpty()) return false
for (element in this) if (predicate(element)) return true
return false
}

샘플코드

1
2
3
4
5
6
7
8
9
10
11
 val isAnyOneOlderThan50 = users.any { it.age > 50 }

println(isAnyOneOlderThan50)

val isAnyOnYoungerThan50 = users.any { it.age <40 }
println(isAnyOnYoungerThan50)


결과
isAnyOneOlderThan50 : false
isAnyOnYoungerThan50 : true

4. count

설명이 불필요…

샘플코드

1
2
3
4
5

val countWhoIsYoungerThan35 = users.count{it.age < 35}
println(countWhoIsYoungerThan35)

결과 : 4

5. find, findLast

조건에 맞는 첫번째 데이터 반환, 만약 조건에 맞는 엘리먼트가 없다면 null리턴

만약 맨 뒤에 엘리먼트릴 return받고 싶다면 findLast를 쓰자!

1
2
3
4
5
6
7
/**
* Returns the first element matching the given [predicate], or `null` if no such element was found.
*/
@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {
return firstOrNull(predicate)
}

샘플코드

1
2
3
4
5
6
7
8
9
10
11
12
13
 val someoneWhoseAgeis32 = users.find { it.age == 32 }

println(someoneWhoseAgeis32.toString())


val someoneWhoseAgeis26 = users.find { it.age == 26 }


println(someoneWhoseAgeis26.toString())

결과
someoneWhoseAgeis32 : User(name='A', age=32)
someoneWhoseAgeis26 : null

6. groupBy

자세한 설명은 생략! 말그대로 그룹바이

샘플코드

1
2
3
4
5
6
7
8
9
val userGroup = users.groupBy { it.age }.toList()

println(userGroup.toString())

결과 :
[(30, [User(name='pkj', age=30), User(name='D', age=30)]),
(40, [User(name='beanbroker', age=40)]), (32, [User(name='A', age=32)]),
(27, [User(name='B', age=27)]),
(44, [User(name='C', age=44)])]