Kotlin

Kotlin in Action - Lamda

onemask 2019. 9. 24. 00:37

본 내용은 Kotlin in Action 책을 읽고 공부한 내용을 정리하는 포스팅입니다.

 

여러 Collection을 다루는 함수를 알아두면 원하는 data에 쉽게 접근할 수 있습니다.

 

Filter 

: 컬렉션 함수를 이터레이션 하면서 주어진 람다에 각 원소를 넘겨 True를 반환하는 원소만 모은다. 

val list = listof(1,2,3,4)
println(list.filter{it %2 ==0})
//[2,4]

결과는 컬렉션 원소 중에 Boolean값을 반환하는 Predicate로 ,
true의 조건을 만족하는 원소만으로 이뤄진 새로운 컬렉션이다. 

 

Map 

: 컬렉션의 원소에 주어진 람다를 적용하여 새 컬렉션을 만든다. 

val list = listof(1,2,3,4)
println(list.map{it * it})
//[1,4,9,16]

groypBy 

: 컬렉션의 어떤 원소의 특정에 따라 값을 분리하고 싶을 때 사용한다. 

개인적으로 map으로 한번 더 filtering 해줘야 야무지게 사용할 수 있다고 생각한다. 

 

 val list = listOf<Int>(1,2,3,4,5,6,7)
    print(list.groupBy {
        it %2==0
    })
    //{false=[1, 3, 5, 7], true=[2, 4, 6]}

여기에서 map으로 key 값을 감쌀것이냐에 따라서 값이 달라진다.  

 val list = listOf<Int>(1,2,3,4,5,6,7)
    print(list.groupBy {
        it %2==0
    }.map {
        it.key
    })
    //[false, true]

value 

 val list = listOf<Int>(1,2,3,4,5,6,7)
    print(list.groupBy {
        it %2==0
    }.map {
        it.value
    })
    //[[1, 3, 5, 7], [2, 4, 6]]

flatMap

: 중첩된 컬렉션 안의 원소를 처리할 수 있다. 

val arr = listof("abc","def")
println(arr.flatMap{it.toList()})
//[a,b,c,d,e,f]

 


 

컬렉션 술어 

- COUNT 

: 원하는 조건의 컬렉션 원소의 개수를 반환한다. 

val list = listOf<Int>(1,2,3,4)
    println(list.filter { it%2==0 }.count())
    //2

 

- find 

: 조건을 만족하는 첫전째 원소를 반환한다. (1개) 
만족하는 원소가 전혀 없는 경우 null을 반환한다. 

 val list = listOf<Int>(1,2,3,4,5,6,7)
    println(list.filter { it%2==0 }.count())

    println(list.find {
        it>10
    })

find의 내부 

/**
 * 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)
}

 

- all 

: 모든 원소가 이 술어를 만족한다면 true 

 val list = listOf<Int>(1,2,3,4,5,6,7)

    print(list.all {
        it>2
    })
    //false

 

- any

: 조건을 해당하는 원소가 1개라도 있다면 true

 val list = listOf<Int>(1,2,3,4,5,6,7)

    print(list.any {
        it>2
    })
    //true

 

드모르간의 법칙을 들어봤다면 

!all = any

all = !any 

라는 것을 알 수 있을 것이다.

 

하지만 ! 부정의 의미는 잘 안 보일수 있기에 가독성이 떨어져 권장하지 않는 다고 한다.. 

 

이 all,any 이 2개는 Predicate Type 으로 Return Type 은 Boolean 이다. 

 

 

LIST