Kotlin:如何将子数组简化为单个数组?

时间:2019-01-30 16:23:42

标签: android kotlin

我在Swift中有一段代码可以将TVSchedule个对象的列表简化为TVMatch个pobjects的数组。每个TVSchedule都有一个称为事件的属性,它是TVMatch es的列表。

swift中的代码如下:

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

我正试图在Kotlin中执行相同的reduce操作,而我的代码如下:

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

但是,Kotlin代码给了我一个类型错误,并且无法编译。这是什么问题?

2 个答案:

答案 0 :(得分:4)

addAll返回一个boolean,但是fold操作的返回值应与给定的初始对象(在这种情况下为ArrayList)具有相同的类型。 您可以只需添加容易解决了一个result后您的addAll - 声明,e.g:

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 }

答案 1 :(得分:4)

我疯了吗,还是不能只替换为

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