集約
sum、count、fold、reduceを学びます
「集約」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
コレクションの集約
集約とは、コレクションを1つの値にまとめる処理です。Kotlinには、sum、count、average、maxなどの既製関数に加えて、汎用的なfoldとreduceが用意されています。
sumとaverage
sumは数値要素を合計し、averageはそれらの平均値をDoubleとして返します。
fun main() {
val numbers = listOf(2, 4, 6, 8)
println("Sum: ${numbers.sum()}")
println("Average: ${numbers.average()}")
}count
countは要素数を返します。必要に応じて、述語で要素を絞り込んでから数えることもできます。
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6)
println("Total: ${numbers.count()}")
println("Even count: ${numbers.count { it % 2 == 0 }}")
}maxOrNullとminOrNull
最大値や最小値を安全に求めるには、maxOrNullとminOrNullを使います。これらは空のコレクションに対してnullを返します。
fun main() {
val numbers = listOf(3, 7, 2, 9, 4)
println("Max: ${numbers.maxOrNull()}")
println("Min: ${numbers.minOrNull()}")
}sumOfとmaxByOrNull
sumOfは各要素から選択した値を合計し、maxByOrNullは選択した値が最大になる要素を見つけます。
data class Item(val name: String, val price: Int)
fun main() {
val items = listOf(Item("a", 10), Item("b", 30), Item("c", 20))
println("Total price: ${items.sumOf { it.price }}")
println("Most expensive: ${items.maxByOrNull { it.price }?.name}")
}fold関数
foldは初期値から開始し、要素を1つの結果にまとめます。ラムダ式は、途中までの累積値と現在の要素を受け取ります。
fun main() {
val numbers = listOf(1, 2, 3, 4)
val total = numbers.fold(100) { acc, n -> acc + n }
println(total)
}foldで型を変更する
初期値を指定するため、foldではStringなど、任意の型の結果を構築できます。
fun main() {
val words = listOf("Kotlin", "is", "fun")
val sentence = words.fold("") { acc, w -> if (acc.isEmpty()) w else "$acc $w" }
println(sentence)
}reduce関数
reduceはfoldに似ていますが、最初の要素を累積値の開始値として使います。コレクションが空の場合は例外をスローし、型を変更することはできません。
fun main() {
val numbers = listOf(1, 2, 3, 4)
val product = numbers.reduce { acc, n -> acc * n }
println(product)
}foldとreduce
主な違いは次のとおりです。
foldは初期値を受け取り、空のコレクションでも動作し、異なる型を返せます。reduceは最初の要素から開始し、空のコレクションでは失敗し、要素の型を維持します。
fun main() {
val empty = emptyList<Int>()
println(empty.fold(0) { acc, n -> acc + n })
println("fold is safe on empty lists")
}runningFoldとrunningReduce
累積値の途中経過をすべて取得したい場合は、runningFold(およびrunningReduce)を使うと、部分的な結果のリストが返されます。
fun main() {
val numbers = listOf(1, 2, 3, 4)
val sums = numbers.runningFold(0) { acc, n -> acc + n }
println(sums)
}集約関数の選び方
用途に合う場合は、専用関数(sum、count、average、maxOrNull)を使います。独自の組み合わせが必要な場合はfoldまたはreduceを使い、初期値や型の変更が必要なときはfoldを優先します。
クイックチェック
foldとreduceの主な違いは何ですか?
復習
sum、count、average、maxOrNull、sumOfによる集約と、汎用的なfold(初期値を指定でき、任意の型にでき、空のコレクションにも安全)およびreduce(最初の要素を初期値にする)を学びました。次は、マップを作成し、入れ子になったコレクションを平坦化します。
よくある質問
「集約」レッスンは無料ですか?
はい。「集約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「集約」で何を学びますか?
sum、count、fold、reduceを学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「集約」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。