Прошу прощения за это название вопроса. Итак, у меня есть класс данных:

data class Day(
    val date: Int = 0,
    val night: Time? = null,
    val morning: Time? = null,
    val noon: Time? = null,
    val evening: Time? = null,
)

Я делаю переменную с типом этого класса, и мне нужно установить значения для этой переменной:

val days = ArrayList<Day>()
        val listOfDays = this
            .groupBy { it.getDayOfMonth() }
            .map { WeatherForDay(it.value) }
            .take(FIVE_DAYS_FORECAST)

        listOfDays.forEach {
            val day = Day()
            var weather: WeatherList
            for (hour in it.weather.indices) {
                weather = it.weather[hour]
                val time = Time(
                    weather.main.temp,
                    weather.main.feels_like,
                    weather.wind.speed,
                    weather.wind.gust,
                    weather.wind.deg,
                    weather.main.pressure,
                )

                when (it.weather[hour].getTime()) {
                    NIGHT_DAYTIME -> day.night = time
                    MORNING_DAYTIME -> day.morning = time
                    DAY_DAYTIME -> day.noon = time
                    EVENING_DAYTIME -> day.evening = time
                }
                day.date = weather.dt
            }
            days.add(day)

Но я не могу, потому что мои атрибуты в классе данных являются значениями. И мне нужно, чтобы это были ценности. Итак, как я могу сделать этот код в правильном стиле с помощью val?

0
SoulReaver313 16 Сен 2021 в 14:22

2 ответа

Лучший ответ

Измените свой код так, чтобы вы создавали экземпляр класса только тогда, когда у вас есть все необходимые параметры.

val listOfDays = this
  .groupBy { it.getDayOfMonth() }
  .map { WeatherForDay(it.value) }
  .take(FIVE_DAYS_FORECAST)

val days = listOfDays.map { listOfDaysDay ->
  val date = listOfDaysDay.weather.firstOrNull()?.dt ?: 0
  val timeItemByTime = listOfDaysDay.weather
    .associateBy { it.getTime() }
    .map { with (it) {
      Time(
        main.temp
        main.feels_like,
        wind.speed,
        wind.gust,
        wind.deg,
        main.pressure
      )
    }
  Day(
    date, 
    timeItemByTime[NIGHT_DAYTIME],
    timeItemByTime[MORNING_DAYTIME],
    timeItemByTime[DAY_DAYTIME],
    timeItemByTime[EVENING_DAYTIME]
  )
}

У меня могут быть ошибки выше. Из-за вашей схемы именования довольно сложно сохранять правильные типы. У вас есть listOfDays, который не является списком вашего класса Day, а является списком какой-то другой сущности. И у вас есть класс с именем Time, который не является временем, а просто набором одновременных погодных условий. И у вас есть что-то еще, называемое «временем», которое, по-видимому, является константами String или Int, которые на самом деле представляют время.

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

1
Tenfour04 16 Сен 2021 в 13:26

Вы можете использовать метод day.copy(night = time), который существует для каждого класса данных. Если вам не нужны новые распределения, единственный способ, который я вижу, - это определить локальные переменные для каждого свойства класса данных и установить их в цикле, а затем, в конце итерации, создать экземпляр класса данных в база этих переменных.

1
sedovav 16 Сен 2021 в 11:26