我需要得到一個2d列表的總大小。這是我的實現:Kotlin減少功能爲2d列表不起作用
fun totalSize(parts: List<List<String>>): Int {
return parts.reduce { total, next -> total + next.size }
}
我得到類型推斷失敗。必需的Int,有名單。但是next.size應該返回Int。
我需要得到一個2d列表的總大小。這是我的實現:Kotlin減少功能爲2d列表不起作用
fun totalSize(parts: List<List<String>>): Int {
return parts.reduce { total, next -> total + next.size }
}
我得到類型推斷失敗。必需的Int,有名單。但是next.size應該返回Int。
更好:總和期間映射操作(從@Ruckus T-臂架評語)
parts.sumBy { it.size }
原件:映射內列表以它們的尺寸的第一(猜測科特林語法):
parts.map { l -> l.size }.reduce { total, i -> total + i }
您可以改爲使用'parts.map {it.size} .sum()'。 –
甚至只是'parts.sumBy {it.size}' –
@ RuckusT-Boom - 我認爲這是目前最清潔的;表現力和簡潔,我想象比fold更高效,因爲sum可能獨立於順序。 – AjahnCharles
在reduce
,total
的第一個值是列表中的第一個元素,它也是一個列表。因此reduce
的返回值的推斷類型必須是List
。
您可以使用fold
代替:
return parts.fold(0, { total, next -> total + next.size })
@OMGPOP - 我認爲這個答案更適合你的問題!感謝njzk2教育我減少和摺疊之間的差異。我甚至在這裏繼續閱讀更多細節:https://stackoverflow.com/questions/25158780/difference-between-reduce-and-foldleft-fold-in-functional-programming-particula – AjahnCharles
我認爲減少將迫使總要同內型(如表。降低將有一個整數計)的簽名。 –
AjahnCharles
@CodeConfident似乎並不是這樣:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reduce.html reduce operation is'operation:(acc:S,T) - > S' T是列表中的類型,S是輸出。 – njzk2
在該行之前有一個類型約束:'inline fun
' - 即T(輸入類型)必須是S的子類型(返回類型)。 – AjahnCharles