In this thread from 2014, Kotlin community members and JetBrains staff discuss the merits of the different methods find and firstOrNull:
https://youtrack.jetbrains.com/issue/KT-5185
While not an official statement, JetBrains’ employee Ilya Ryzhenkov describes it as:
I think we can undeprecate
findand make it an alias tofirstOrNull. Much likeindexOfhas well-known semantics,findis also widely recognised as “find first item matching predicate or return null if nothing is found”. People who like precise meaning can usefirstOrNull,singleOrNullto express the intent.
In other words:
find(predicate)andfirstOrNull(predicate)are identical in behaviour andfindcan be considered alias offirstOrNullfindis kept around as an alias because it’s more intuitive and discoverable for programmers not already familiar with these Linq-style – or functional – methods.
In actuality the definition of Array<out T>.find is not defined as an alias, but as a wrapper (though the optimizing compiler will inline it, effectively making it an alias):
https://github.com/JetBrains/kotlin/blob/1.1.3/libraries/stdlib/src/generated/_Arrays.kt#L657
@kotlin.internal.InlineOnly
public inline fun <T> Array<out T>.find(predicate: (T) -> Boolean): T? {
return firstOrNull(predicate)
}
Ditto for Sequence<T>.find:
https://github.com/JetBrains/kotlin/blob/1.1.3/libraries/stdlib/src/generated/_Sequences.kt#L74
@kotlin.internal.InlineOnly
public inline fun <T> Sequence<T>.find(predicate: (T) -> Boolean): T? {
return firstOrNull(predicate)
}
(I’m not a Kotlin user myself, but I’m surprised that these methods are implemented as compile-time generated code manually defined for each collection type instead of as a single JVM generic method – is there some reason for this?)