【Kotlin】maxOfとmaxByOrNullの違い
こんにちは、ミツです。
maxOfとmaxByOrNullの違いについて、気になって調べたのでメモを残しておきます。
結論から言うとこの二つです。
1、空のリストが入ってきた場合、エラーになるかNullになるか
2、戻り値がラムダ式の入力か出力か
公式ドキュメント
公式のドキュメントを見てみましょう。
1の空のリストが入ってきた場合について
maxByOrNullの説明には空の場合はNullが返されると書いてあります。
null
if there are no elements.
一方、maxOfの説明には空の場合はNoSuchElementException
がスローされると書いてありますね。
NoSuchElementException
- if the array is empty.
2の戻り値について
戻り値の型を見てみるとmaxByOrNullの説明には->の左側(ラムダ式の入力)の「T?」が返されると書いてあります。
一方、maxOfの説明には->の右側(ラムダ式の出力)の「R」と書いてあります。
実際に確かめてみよう
fun main() {
val temp: List<Int> = emptyList()
println(temp.maxByOrNull{ it }) // null
// println(temp.maxOf{ it }) // java.util.NoSuchElementException
val temp2: List<Int> = listOf(1, 2, 3)
println(temp2.maxByOrNull{ it * 2 }) // 3
println(temp2.maxOf{ it * 2 }) // 6
}
tempで結論1の検証、temp2で結論2の検証してます。
まとめ
戻り値が違うのはちょっと驚きました。
適切に使い分けていきたいですね!