더북(TheBook)

이제 이런 함수를 사용해 여러 지급을 신용 카드에 따라 별도 그룹으로 묶어주는 함수를 새로 만들 수 있다. 다음 예제를 보라.

예제 1-5 신용 카드에 따라 지급 그룹화하기

class Payment(val creditCard: CreditCard, val amount: Int) {
    fun combine(payment: Payment): Payment =
        if (creditCard == payment.creditCard)
            Payment(creditCard, amount + payment.amount)
        else
            throw IllegalStateException("Cards don't match.")

    companion object {
        fun groupByCard(payments: List<Payment>): List<Payment> =
            payments.groupBy { it.creditCard } 
                             .values 
                             .map { it.reduce(Payment::combine) } 
    }
}

List<Payment>를 Map<CreditCard, List<Payment>>로 변환한다. 반환하는 맵에 들어 있는 각 리스트에는 해당 신용 카드에 대한 지급이 들어 있다.

Map<CreditCard, List<Payment>>를 List<List<Payment>>로 변환한다.

각 List<Payment>를 단일 Payment로 축약한다. 이를 통해 List<Payment>에 들어 있는 모든 지급을 하나의 Payment로 합친다.

groupByCard 함수를 호출할 때 함수에 대한 참조를 사용했다. 함수 참조는 자바 메서드 참조와 비슷하다. 이 예제를 이해할 수 없어도 걱정하지 말라. 이 책은 바로 그런 사람을 위한 책이다! 이 책을 다 마칠 때 쯤에는 이런 코드를 자유자재로 작성하는 전문가가 될 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.