我在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代码给了我一个类型错误,并且无法编译。这是什么问题?
答案 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 }
?