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

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

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