새소식

반응형
250x250
My Study/Kotlin

Study About Kotlin 10

  • -
728x90
반응형
728x90

Kotlin에서 컬렉션을 함수형으로 다루는 방법

먼저 사용할 class 정의

data class Fruit(
    val id : Long,
    val name: String,
    val factoryPrice : Long,
    val currentPrice : Long
)

val fruits = listOf(Fruit(1, "바나나", 2000L, 1500L),
        Fruit(2, "바나나", 2000L, 1500L),
        Fruit(3, "사과", 1500L, 1200L),
        Fruit(4, "사과", 1200L, 1000L),
        Fruit(5, "사과", 1700L, 1600L),
        Fruit(6, "사과", 2000L, 1700L),
        Fruit(7, "귤", 1000L, 500L))

 

사과의 가격들을 알고싶을 때

val apples = fruits.filter { fruit -> fruit.name == "사과" }

 

Index가 필요할 시

val apples1 = fruits.filterIndexed { idx, fruit ->
        println(idx);
        fruit.name == "사과"
    }

 

사과의 가격들을 알려줘야 하는 경우(map에서 index가 필요한 경우 위와 비슷하게 mapIndexed로 가능하다.)

매핑 결과가 null이 아닌 것만 가져오고 싶을 때에는 mapNotNull로 사용도 가능하다.

val applePrices = fruits.filter { fruit -> fruit.name == "사과" }
        .map { fruit -> fruit.currentPrice }

 

모든 과일이 사과인지 확인할 때에는 all을 사용한다.

(all = 전체가 true여야 true , none = 전체가 false여야 true, any = 조건을 하나라도 만족하면 true)

val isAllApple = fruits.all { fruit -> fruit.name == "사과" }

 

출고가 10,000원 이상의 과일이 하나라도 있는지?

val isUnderPrice = fruits.any {fruit -> fruit.factoryPrice >= 10_000}

 

총 과일의 개수를 알고싶을 때

val fruitCount = fruits.count()

 

낮은 가격순으로 보여줄 때에는 sortedBy, sortedByDescending(내림차순)

val fruitCount1 = fruits.sortedBy { fruit -> fruit.currentPrice }

 

과일의 종류를 확인할 때(중복 제거)

val distinctFruitNames = fruits.distinctBy { fruit -> fruit.name }
        .map { fruit -> fruit.name }

 

리스트의 첫번째 혹은 마지막이 필요할 때

fruits.first()
fruits.last()

 

list 를 map으로 바꾸는 여러가지 방법

// 과일 이름이 key
val map: Map<String, List<Fruit>> = fruits.groupBy { fruit -> fruit.name } 

// 중복되지 않는 key로 map을 만들 때 associateBy 사용
val map1: Map<Long, Fruit> = fruits.associateBy { fruit -> fruit.id } 

// key = 과일이름, value = 과일의 출고가
val map2: Map<String, List<Long>> = fruits
        .groupBy({fruit -> fruit.name}, {fruit -> fruit.factoryPrice})
        
// key = 사과
val map3: Map<String, List<Fruit>> = fruits.groupBy { fruit -> fruit.name}
        .filter { (key, value) -> key == "사과" }

 

list 속 list에서 출고가와 현재가가 같은 것 리스트로 뽑기

val fruitsInList: List<List<Fruit>> = listOf(
        listOf(
            Fruit(3, "사과", 1500L, 1200L),
            Fruit(4, "사과", 1200L, 1000L),
            Fruit(5, "사과", 1700L, 1600L),
            Fruit(6, "사과", 2000L, 1700L),
        ),
        listOf(
            Fruit(1, "바나나", 2000L, 1500L),
            Fruit(2, "바나나", 2000L, 1500L),
        ),
        listOf(
            Fruit(7, "귤", 1000L, 500L)
        )
    )

    val samePriceFruits = fruitsInList.flatMap { list ->
        list.filter { fruit -> fruit.factoryPrice == fruit.currentPrice }
    }
728x90
반응형

'My Study > Kotlin' 카테고리의 다른 글

Study About Kotlin 9  (0) 2024.03.28
Study About Kotlin 8  (0) 2024.03.28
Study About Kotlin 7  (0) 2024.03.26
Study About Kotlin 6  (0) 2024.03.09
Study About Kotlin 5  (0) 2024.02.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.