Котлин: Как я могу уменьшить дочерние массивы в один массив? - PullRequest
0 голосов
/ 30 января 2019

У меня есть кусок кода в Swift, который сокращает список TVSchedule объектов в массив TVMatch объектов.Каждый TVSchedule имеет свойство под названием events, то есть список TVMatch es.

Код в swift следующий:

var matches: [TVMatch] {
    let slots = timeSlots.reduce(into: [TVMatch]()) { (result, schedule) in
        result.append(contentsOf: schedule.events)
    }
    return slots
}

Я пытаюсь сделать то же самоеуменьшить в Kotlin и код, который я имею в следующем:

val matches: ArrayList<TVMatch>
    get() {
        val slots = timeSlots.fold(arrayListOf<TVMatch>()) { result, schedule ->
            result.addAll(schedule.events)
        }
        return slots
    }

Однако код Kotlin дает мне ошибку типа, и не компилируется.В чем здесь проблема?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я сумасшедший, или вы не можете просто заменить код на

val matches: List<TVMatch>
    get() = timeSlots.flatMap { schedule -> schedule.events }

?

0 голосов
/ 30 января 2019

addAll возвращает boolean, но возвращаемое значение операции fold должно быть того же типа, что и данный исходный объект (в данном случае ArrayList).Вы можете легко решить эту проблему, просто добавив result после вашего addAll заявления, например:

result.addAll(schedule.events)
result // this is now the actual return value of the fold-operation

В качестве альтернативы просто используйте apply или аналогичный:

result.apply {
  addAll(schedule.events)
} // result is the return value then

Обратите внимание, что вы можете вообще упростить, используя flatMap до всего (примечание: если вы используете этот подход, matches оцениваются только один раз, но flatMapзвезда в любом случае здесь; -))):

val matches = timeSlots.flatMap { it.events } // this is a new list! (note, if you do several mappings in a row, you may want to use timeSlots.asSequence().flatMap { }.map { }.toList() / or .toMutableList() instead

В качестве альтернативы, если вам действительно нужно, чтобы matches был типа ArrayList, используйте flatMapTo вместо:

val matches = timeSlots.flatMapTo(ArrayList()) { it.events }

Вы, конечно, можете оставить get(), если необходимо, или просто перенести получение совпадений на свою собственную функцию, например:

fun getMatches() = timeSlots.flatMapTo(ArrayList()) { it.events }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...