개발일지

Kotlin in A..Z - Aggregate Operation 본문

Kotlin (코틀린)

Kotlin in A..Z - Aggregate Operation

강태종 2020. 11. 28. 15:52

any()

Collection에 하나라도 있으면 true

=> 만족하는 하나를 찾을때까지 검사한다.

fun main() {
    val list0 = listOf<Int>()
    println(list0.any())

    val list1 = listOf(1, 2, 3)
    println(list1.any())

    val list2 = listOf(1, 2, 3, 1, 2, 3)
    list2.any {
        println(it)
        it == 3
    }
}
false
true
1
2
3

all()

모든 원소가 일치하면 true

=> 전부다 검사하거나, 중간에 일치하지 않는 원소가 있으면 끝난다.

fun main() {
    val list0 = listOf<Int>()
    println(list0.all { it > 0 })

    val list1 = listOf(1, 2, 3)
    println(list1.all { it > 2 })

    val list3 = listOf(1, 2, 3, 1, 2, 3)
    list3.all {
        println(it)
        it > 0
    }
}
true
false
1
2
3
1
2
3

count

일치하는 원소의 갯수를 반환한다.

=> 처음부터 끝까지 검사한다.

fun main() {
    val array = arrayOf(1, 2, 3)
    println(array.count())
    println(array.count {
        println(it)
        it > 2
    })
}
3
1
2
3
1

fold

왼쪽에서 오른쪽으로 진행하며 연산을 수행하는 함수이다.

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5)
    println(array.fold(0) { acc, i ->
        println("ACC : $acc, I : $i")
        acc + i
    })
}
ACC : 0, I : 1
ACC : 1, I : 2
ACC : 3, I : 3
ACC : 6, I : 4
ACC : 10, I : 5
15

foldRight

fold의 반대방향

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5)
    println(array.foldRight(0) { acc, i ->
        println("ACC : $acc, I : $i")
        acc + i
    })
}
ACC : 5, I : 0
ACC : 4, I : 5
ACC : 3, I : 9
ACC : 2, I : 12
ACC : 1, I : 14
15

forEach

모든 원소를 접근하며 action을 실행한다.

fun main() {
    val list = listOf(1, 2, 3)
    list.forEach {
        println(it)
    }
}
1
2
3

forEachIndexed

forEach에 Index를 추가한 버전

fun main() {
    val list = listOf(1, 2, 3)
    list.forEachIndexed { index, value ->
        println("Index : $index => Value : $value")
    }
}
Index : 0 => Value : 1
Index : 1 => Value : 2
Index : 2 => Value : 3

maxOf

특정한 값에 대한 최대값

data class Node(
        var index: Int,
        var dist: Long
)

fun main() {
    val list = listOf(Node(0, 2), Node(1, 4), Node(2, 0), Node(-1, 4))

    println(list.maxOf { it.dist })
}
4

maxOfWith

maxOf에 Comparator을 지정할 수 있다.

data class Node(
        var index: Int,
        var dist: Long
)

fun main() {
    val list = listOf(Node(0, 2), Node(1, 4), Node(2, 0), Node(-1, 4))

    println(list.maxOf { it.dist })
    println(list.maxOfWith(compareBy({it.dist}, {-it.index}), {it}))
}
4
Node(index=-1, dist=4)

none

조건에 만족하는 요소가 없으면 true

=> 처음부터 확인하고 조건에 만족하는 요소가 있으면 false를 반환하며 종료

fun main() {
    val list = listOf(1, 2, 3)
    println(list.none {
        println(it)
        it < 0}
    )
}
1
2
3
true

reduce

fold와 비슷하지만 초기값이 원소의 첫번째 값이다.

fun main() {
    val list = listOf(1, 2, 3)
    println(list.reduce { acc, i ->
        acc + i
    })
}
6

 

Comments