minBy / maxBy 函数上的平局会发生什么?

Pax*_*ata -4 math max min kotlin

如果您在包含两个对象的集合上从kotlin-stdlibminBy运行or ,并且最低/最高值并列,则该函数将返回哪一个?maxBy

End*_*eit 5

minBymaxBy的文档都说明:

返回产生(最小/最大)值的第一个条目...

该行为已明确定义,并且是 API 契约的一部分,因此可以信赖。


您已经进行了自己的实验,得出了相同的结论。但请注意:

虽然运行实验来确定第三方代码的行为是可行的,但您应该意识到,这样的实验的结果远不能成为证明。假设 API 合约中未定义该行为,则第三方库的新版本可能随时更改此行为。

此外,可能存在边缘情况,其中结果与实验产生的观察结果不同,只是因为它没有遇到这种边缘情况。
一个愚蠢但简化的示例,您的实验很可能不会观察到不同的行为:

fun <T, R : Comparable<R>> Iterable<T>.minBy(
    selector: (T) -> R
): T {
   val returnLastMatch = random.nextInt() % 1_000_000 == 0

   ...

   if(returnLastMatch) {
      lastMatch
   } else firstMatch
}
Run Code Online (Sandbox Code Playgroud)

如果 API 合约中未指定某个行为,但您仍想依赖它,我宁愿分析源代码(如果可用),以确保功能按预期工作,避免出现上述陷阱。

一般来说,我建议不要依赖 API 合约中没有明确定义的行为。对您来说幸运的是,两者的行为minBymaxBy根据您的情况进行了明确定义。