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 }
}