この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
Implement Shop.getCustomerWithMaximumNumberOfOrders() and Customer.getMostExpensiveOrderedProduct() using max, min, maxBy, or minBy.
listOf(1, 42, 4).max() == 42
listOf("a", "ab").minBy { it.length } == "a"
// Return a customer whose order count is the highest among all customers
fun Shop.getCustomerWithMaximumNumberOfOrders(): Customer? = TODO()
// Return the most expensive product which has been ordered
fun Customer.getMostExpensiveOrderedProduct(): Product? = TODO()
狙い
ここで考えて欲しい問題の意図はなんだろうか?
コレクションを処理する便利関数はたくさんあるので使って覚えよう。
解答例
fun Shop.getCustomerWithMaximumNumberOfOrders(): Customer? =
customers.maxBy { it.orders.size }
fun Customer.getMostExpensiveOrderedProduct(): Product? =
orders.flatMap { it.products }.maxBy { it.price }
maxByは最大の要素をみつけます。どの要素で比較するのかをラムダで書きます。{ it.orders.size }
わかりやすい等価コードを書きました。
fun max(shop: Shop): Customer? {
var maxCustomer: Customer? = null
for (customer in shop.customers) {
if (customer.orders.size > maxCustomer?.orders?.size ?: -1) {
maxCustomer = customer
}
}
return maxCustomer
}
minByは最小の要素を見つけます。今回の例ではflatMapで一度データを整形した後に最小を探しています。
あとがき
Day28.でまたお会いしましょう。