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