Есть ли разница между String.getOrElse() и String.elementAtOrElse()?

#kotlin

#kotlin

Вопрос:

Как указано в названии:

Есть ли разница между String.getOrElse() и String.elementAtOrElse() ? С функциональной точки зрения они кажутся полностью идентичными, может быть, какая-то разница в производительности?

Тот же вопрос относится к String.getOrNull() и String.elementAtOrNull() .

Комментарии:

1. Отличный вопрос! Было бы интересно услышать историю, стоящую за этим. Я делаю ставку на некоторые загадочные старые уровни совместимости с JVM или JS.

Ответ №1:

Чтобы объяснить, почему:

Из проблемы, которая добавила их в https://youtrack.jetbrains.com/issue/KT-6952 похоже, что elementAtOrElse() он был добавлен первым и назван таковым для совместимости с Iterable s, в то время getOrElse() как был добавлен позже для совместимости с List s.

Ответ №2:

Глядя на реализацию в https://github.com/JetBrains/kotlin/blame/master/libraries/stdlib/common/src/generated/_Strings.kt они выглядят одинаково.

 /**
 * Returns a character at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this char sequence.
 * 
 * @sample samples.collections.Collections.Elements.elementAtOrElse
 */
@kotlin.internal.InlineOnly
public inline fun CharSequence.elementAtOrElse(index: Int, defaultValue: (Int) -> Char): Char {
    return if (index >= 0 amp;amp; index <= lastIndex) get(index) else defaultValue(index)
}
 
 /**
 * Returns a character at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this char sequence.
 */
@kotlin.internal.InlineOnly
public inline fun CharSequence.getOrElse(index: Int, defaultValue: (Int) -> Char): Char {
    return if (index >= 0 amp;amp; index <= lastIndex) get(index) else defaultValue(index)
}
 

Я надеюсь, что кто-нибудь еще может предоставить подробную информацию об истории этого.

Ответ №3:

Те самые ссылки, которые вы включили в свой вопрос, позволяют вам увидеть исходный код каждой реализации, который говорит вам, что нет, разницы нет.

На самом деле elementAtOrNull буквально просто вызывает getOrNull .

Комментарии:

1. Спасибо, кажется, я (source) все время игнорировал кнопку на страницах документации.