버튼 수집상

[Kotlin] List.filter 파헤치기 본문

TIL - Kotlin

[Kotlin] List.filter 파헤치기

cocokaribou 2024. 4. 16. 17:18

다양한 조건을 만족하는 요소들만 남긴 리스트 리턴하기.

물론 한 방에 여러가지 필터 조건을 적용시키기 보다 상황별로 함수를 분리하는 것도 방법이다.

예시1

코틀린 플레이그라운드 링크

import java.util.Calendar
import java.util.Date

enum class Job {
    ACCOUNTANT,
    SALESMAN,
    MARKETER,
    DEVELOPER;
}

data class SimpleObject(
    val name : String,
    val isPremium : Boolean = false,
    val age: Int,
    val job: Job
)

val simpleList = listOf(
	SimpleObject("John", false, 11, Job.SALESMAN),
	SimpleObject("Mark", true, 23, Job.DEVELOPER),
	SimpleObject("Bob", false, 30, Job.MARKETER),
	SimpleObject("Heize", true, 12, Job.ACCOUNTANT),
	SimpleObject("Doug", true, 40, Job.ACCOUNTANT),
	SimpleObject("Hyuk", true, 30, Job.DEVELOPER)
)
fun main() { 
    // isPremium 값이 true면서, 20세 이상이면서, 직업이 개발자인 사람들 filter
    val filteredList = simpleList.filter { person ->
        person.isPremium && person.age >= 20 && person.job == Job.DEVELOPER
    }
    
    // 이름만 출력
    print(filteredList.joinToString{it.name})
}

 

예시2

// 푸시알림 필터링하기
fun filterPushList(pushType: PushType, data: ArrayList<PushItem>, isUnreadOnly: Boolean = false): List<PushItem> {
    val filteredList = data.toMutableList()

    // 한 달 사이 날짜 정보
    val cal = Calendar.getInstance().apply {
        time = Date()
        add(Calendar.MONTH, -1)
    }

    // 필터링 조건: 한 달 이내, 푸시 타입이 일치 (광고성 등), isUnreadOnly가 true 일 경우 안읽은 푸시만 표시
    return filteredList.filter { push ->
         push.date > cal.time && push.type == pushType && (!isUnreadOnly || !push.isOpened)
    }
}
728x90