Collections find和firstOrNull之间有什么区别?

Collections find和firstOrNull之间有什么区别?,collections,kotlin,Collections,Kotlin,给定从中提取的以下代码: 我自己的解决方案使用了客户。查找。两者都适用于koan场景 和的文档似乎非常相似 这两种功能之间的区别是什么?在2014年的这篇文章中,Kotlin社区成员和JetBrains员工讨论了不同方法的优点find和firstOrNull: JetBrains的雇员伊利亚·雷振科夫(Ilya Ryzenkov)虽然不是官方声明,但将其描述为: 我认为我们可以取消对的预测,找到,并将其作为firstOrNull的别名。与indexOf有着众所周知的语义一样,find也被广泛认

给定从中提取的以下代码:

我自己的解决方案使用了
客户。查找
。两者都适用于koan场景

和的文档似乎非常相似


这两种功能之间的区别是什么?

在2014年的这篇文章中,Kotlin社区成员和JetBrains员工讨论了不同方法的优点
find
firstOrNull

JetBrains的雇员伊利亚·雷振科夫(Ilya Ryzenkov)虽然不是官方声明,但将其描述为:

我认为我们可以取消对
的预测,找到
,并将其作为
firstOrNull
的别名。与
indexOf
有着众所周知的语义一样,
find
也被广泛认为是“查找第一个匹配谓词的项或在未找到任何项时返回null”。喜欢精确含义的人可以使用
firstOrNull
singleOrNull
来表达意图

换言之:

  • find(谓词)
    firstOrNull(谓词)
    在行为上是相同的,
    find
    可以被视为
    firstOrNull
  • find
    是一个别名,因为对于不熟悉这些Linq风格或函数式方法的程序员来说,它更直观、更容易发现
实际上,
Array.find
的定义不是作为别名定义的,而是作为包装器定义的(尽管优化编译器将其内联,有效地使其成为别名):

@kotlin.internal.InlineOnly
公共内联fun数组.find(谓词:(T)->布尔):T?{
返回firstOrNull(谓词)
}
序列同上。查找

@kotlin.internal.InlineOnly
公共内联有趣序列.find(谓词:(T)->布尔):T?{
返回firstOrNull(谓词)
}

(我自己不是Kotlin用户,但我很惊讶这些方法被实现为手动为每个集合类型定义的编译时生成的代码,而不是单个JVM通用方法-这有什么原因吗?

数组针对Kotlin中的原语进行了优化。指。
fun Shop.findAnyCustomerFrom(city: City): Customer? {
    // Return a customer who lives in the given city, or null if there is none
    return customers.firstOrNull { it.isFrom(city) }
}
@kotlin.internal.InlineOnly
public inline fun <T> Array<out T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}
@kotlin.internal.InlineOnly
public inline fun <T> Sequence<T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}