Функция maxByOrNull в Котлине

#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 )

Мы получаем это, потому что:

Вся страница для нулевой безопасности весьма полезна.

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

1. Это отличное объяснение, которого я не ожидал. Большое вам спасибо!

2. @Алекс. T Также может добавить объяснение функции расширения 🙂