雑記ブログ(仮)

アウトプットの練習。書きたいこと書く。

【Kotlin】maxOfとmaxByOrNullの違い

こんにちは、ミツです。

 

maxOfとmaxByOrNullの違いについて、気になって調べたのでメモを残しておきます。

 

結論から言うとこの二つです。

1、空のリストが入ってきた場合、エラーになるかNullになるか
2、戻り値がラムダ式の入力か出力か

 

公式ドキュメント

公式のドキュメントを見てみましょう。

kotlinlang.org

kotlinlang.org

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の検証してます。

 

まとめ

戻り値が違うのはちょっと驚きました。

適切に使い分けていきたいですね!