Загрузка данных


// data class автоматически генерирует методы toString(), equals(), hashCode() и copy()
data class Product(
    val id: Int,
    val name: String,
    val price: Double,
    val category: String = "general" // Значение по умолчанию
)

data class Order(
    val orderId: Int,
    val customerName: String,
    val items: List<Product>
)

// Метод-расширение (Extension function): добавляем новую функцию к уже существующему классу Order
fun Order.totalPrice(): Double {
    // sumOf перебирает товары и складывает их цены (it — текущий товар)
    return items.sumOf { it.price }
}

fun main() {
    // Создаем 4 товара с разными категориями
    val p1 = Product(1, "Ручка", 50.0, "general")
    val p2 = Product(2, "Тетрадь", 80.0, "general")
    val p3 = Product(3, "Наушники", 2500.0, "electronics")
    val p4 = Product(4, "Шоколадка", 120.0, "food")

    // Создаем 2 заказа
    val order1 = Order(101, "Антон", listOf(p1, p2, p3))
    val order2 = Order(102, "Иван", listOf(p4, p2))

    // Выводим информацию по первому заказу
    // toString() у data class выводит объект красиво в строковом виде
    println("Заказ №${order1.orderId}, Клиент: ${order1.customerName}")
    println("Товары: ${order1.items}")
    println("Итоговая сумма: ${order1.totalPrice()} руб.\n")

    // Выводим информацию по второму заказу
    println("Заказ №${order2.orderId}, Клиент: ${order2.customerName}")
    println("Товары: ${order2.items}")
    println("Итоговая сумма: ${order2.totalPrice()} руб.\n")

    // Использование copy() для создания акционного товара со скидкой 20%
    val discountedHeadphones = p3.copy(price = p3.price * 0.8)
    println("Исходный товар: $p3")
    println("Товар по акции (-20%): $discountedHeadphones")
}