728x90

1. 필터와 맵

- filter

특정 조건을 만족하는 데이터만 List에 저장

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

 

- filterIndexed

filter에서 인덱스가 함께 필요할 경우

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

 

- map

필터링 후 특정 데이터만 저장하고 싶은 경우

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

 

- mapIndexed

map에서 인덱스가 함께 필요한 경우

val applePrices = fruits.filter { fruit -> fruit.name == "사과" }
    .mapIndexed { idx, fruit -> 
    	println(idx)
    	fruit.currentPrice 
}

 

- mapNotNull

map에서 null이 아닌 값만 저장하고 싶은 경우

val applePrices = fruits.filter { fruit -> fruit.name == "사과" }
	.mapNotNull { fruit -> fruit.nullOrValue() }

2. 다양한 컬렉션 처리 기능

- all

조건을 모두 만족하면 true, 그렇지 않다면 false

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

 

- none

조건을 모두 불만족하면 true, 그렇지 않다면 false

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

 

- any

조건을 하나라도 만족하면 true, 그렇지 않다면 false

val isPrice = fruits.any { fruit -> fruit.price >= 10_000 }

 

- count

총 개수

val count = fruits.count()

 

- sortedBy

오름차순 정렬

val sortFruits = fruits.sortedBy { fruit -> fruit.price }

 

- soredByDescending

내림차순 정렬

val sortFruits = fruits.sortedByDescending { fruit -> fruit.price }

 

- distinct

변형된 값을 기준으로 중복을 제거

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

 

- first

첫번 째 값을 가져온다 (null일 경우 예외 발생)

fruits.first()

 

- firstOrNull

첫번 째 값을 가져온다. 값이 없을 경우 null을 가져온다

fruits.firstOrNull()

 

- last

마지막 값을 가져온다 (null일 경우 예외 발생)

fruits.last()

 

- lastOrNull

마지막 값을 가져온다. 값이 없을 경우 null을 가져온다

fruits.lastOrNull()

3. List to Map

- groupBy

조건 값을 기준으로 묶어서 map으로 추출하고 싶을 때

ex) 과일 이름을 key값으로 List를 저장하고 싶을 때

val fruitsMap: Map<String, List<Fruit>> = 
	fruits.groupBy { fruit -> fruit.name }
    
/* 응용도 가능 */
val fruitsMap: Map<String, List<Fruit>> = 
	fruits.groupBy { fruit -> fruit.name }
    	.filter { (key, value) -> key == "사과" }

 

List에 특정 값만 묶어서 map으로 추출하고 싶을 때 

ex) 과일 이름을 Key값으로 가격만 List로 저장하고 싶을 때

val fruitsMap: Map<String, List<Long>> = 
	fruits.groupBy({ fruit -> fruit.name }, { fruit -> fruit.price })

 

- associateBy

중복되지 않는 키를 가지고 Map을 만들고 싶을 때

ex) 과일 ID를 Key값으로 과일 객체를 저장하고 싶을 때

val fruitMap: Map<Long, Fruit> = 
	fruits.associateBy { fruit -> fruit.id }

 

객체가 아닌 특정 값을 value로 저장하고 싶을 때

ex) 과일 ID를 Key값으로 가격 값을 저장하고 싶을 때

val fruitMap: Map<Long, Long> = 
	fruits.associateBy({ fruit -> fruit.id }, { fruit -> fruit.price })

 

 


4. 중첩된 컬렉션 처리

- flatMap

List안에 중첩된 List들이 있는 자료 구조일 경우 조건에 만족하는 데이터만 단일 List로 변경해준다

ex) 출고가와 현재가가 동일한 과일을 단일 List로 저장하고 싶을 때

val fruitsInList: List<List<FruitDto>> = listOf(
    listOf(
        FruitDto(1L, "사과", 1_000, 1_500),
        FruitDto(2L, "사과", 1_200, 1_500),
        FruitDto(3L, "사과", 1_500, 1_500),
    ),
    listOf(
        FruitDto(4L, "바나나", 1_000, 1_500),
        FruitDto(5L, "바나나", 1_200, 1_500),
        FruitDto(6L, "바나나", 1_500, 1_500),
    ),
    listOf(
        FruitDto(7L, "수박", 1_000, 1_500),
    )
)
var samePriceFruits = fruitsInList.flatMap { list -> 
    list.filter { fruit -> fruit.factoryPrice == fruit.currentPrice } 
}

 

List 안에 또 List를 필터링하는 람다가 있기 때문에 가독성이 떨어진다

아래와 같이 리팩토링이 가능하다

data class FruitDto(
    val id: Long,
    val name: String,
    val factoryPrice: Long,
    val currentPrice: Long,
) {
    /* custom getter 추가 */
    val isSamePrice: Boolean
        get() = this.factoryPrice == this.currentPrice
}

/* 확장 함수 추가 */
val List<FruitDto>.samePriceFilter: List<FruitDto>
    get() = this.filter(FruitDto::isSamePrice)
/*var samePriceFruits = fruitsInList.flatMap { list ->
    list.filter { fruit -> fruit.factoryPrice == fruit.currentPrice }
}*/

var samePriceFruits = fruitsInList.flatMap { list -> list.samePriceFilter }

 

- flatten

중첩되어있는 컬렉션을 중첩 해제 시킬 때 사용

ex) List<List<Fruit>> -> List<Fruit>로 변경

fruitsInList.flatten()

인프런 강의

[자바 개발자를 위한 코틀린 입문] part1 - 최태현 강사님
https://www.inflearn.com/course/java-to-kotlin/dashboard

728x90
복사했습니다!