#kotlin
Вопрос:
В настоящее время я изучаю Котлин, и у меня есть вопрос. В приведенном ниже коде я не понял работу, проделанную в строках 2 и 3. На самом деле я понял проделанную работу, но код показался мне немного сложным. Можете ли вы объяснить код в этих строках?
data class Item(val name: String, val price: Float) // 1
data class Order(val items: Collection<Item>)
fun Order.maxPricedItemValue(): Float = this.items.maxByOrNull { it.price }?.price ?: 0F // 2
fun Order.maxPricedItemName() = this.items.maxByOrNull { it.price }?.name ?: "NO_PRODUCTS" // 3
val Order.commaDelimitedItemNames: String // 4
get() = items.map { it.name }.joinToString()
fun main() {
val order = Order(listOf(Item("Bread", 25.0F), Item("Wine", 29.0F), Item("Water", 12.0F)))
println("Max priced item name: ${order.maxPricedItemName()}") // 5
println("Max priced item value: ${order.maxPricedItemValue()}")
println("Items: ${order.commaDelimitedItemNames}") // 6
}
Я был бы очень рад, если бы вы могли помочь. Спасибо!
Ответ №1:
this
является примером того Order
. В Order
нем содержится коллекция Item
. Каждый Item
из них содержит a name
и a price
Это означает, что это:
this.items.maxByOrNull { it.price }?.price ?: 0F
переводится как:
- В этом
Order
случае возьмите из коллекцииItem
то , что содержит самое большоеprice
. - Если есть фактический
Item
возвратprice
, тоItem
- Если
Item
в этом порядке нет фактического значения, то дайте мне null (и если вы дадите мне null, я вернусь0
в видеFloat
числа).
И это:
this.items.maxByOrNull { it.price }?.name ?: "NO_PRODUCTS"
переводится как:
- В этом
Order
случае возьмите из коллекцииItem
то , что содержит самое большоеprice
. - Если есть фактический
Item
возвратname
, тоItem
- Если
Item
в этом порядке нет фактического значения, то дайте мне null (и если вы дадите мне null, я вернусь кNO_PRODUCTS
)
Мы получаем это, потому что:
- maxByOrNull в
items.maxByOrNull {it.price }
вернетItem
самую большую цену, но еслиitems
коллекция пуста, она вернетсяnull
- Безопасный вызов
?
означает, что мы хотим выполнить следующий процесс только в том случае, если наше значение не равно нулю (в нашем примере мы хотим вернуть результат толькоmaxByOrNull
в том случае, если это неnull
так). - Оператор Элвиса
?: something
означает, что если предыдущее значение равно нулю, то этоsomething
значение вы получите
Вся страница для нулевой безопасности весьма полезна.
Комментарии:
1. Это отличное объяснение, которого я не ожидал. Большое вам спасибо!
2. @Алекс. T Также может добавить объяснение функции расширения 🙂