2017-08-15 51 views
2

我需要得到一個2d列表的總大小。這是我的實現:Kotlin減少功能爲2d列表不起作用

fun totalSize(parts: List<List<String>>): Int { 
     return parts.reduce { total, next -> total + next.size } 
    } 

我得到類型推斷失敗。必需的Int,有名單。但是next.size應該返回Int。

+0

我認爲減少將迫使總要同內型(如表。降低將有一個整數計)的簽名。 – AjahnCharles

+0

@CodeConfident似乎並不是這樣:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reduce.html reduce operation is'operation:(acc:S,T) - > S' T是列表中的類型,S是輸出。 – njzk2

+2

在該行之前有一個類型約束:'inline fun ' - 即T(輸入類型)必須是S的子類型(返回類型)。 – AjahnCharles

回答

5

更好:總和期間映射操作(從@Ruckus T-臂架評語)

parts.sumBy { it.size } 

原件:映射內列表以它們的尺寸的第一(猜測科特林語法):

parts.map { l -> l.size }.reduce { total, i -> total + i } 
+2

您可以改爲使用'parts.map {it.size} .sum()'。 –

+2

甚至只是'parts.sumBy {it.size}' –

+1

@ RuckusT-Boom - 我認爲這是目前最清潔的;表現力和簡潔,我想象比fold更高效,因爲sum可能獨立於順序。 – AjahnCharles

1

reducetotal的第一個值是列表中的第一個元素,它也是一個列表。因此reduce的返回值的推斷類型必須是List

您可以使用fold代替:

return parts.fold(0, { total, next -> total + next.size }) 
+0

@OMGPOP - 我認爲這個答案更適合你的問題!感謝njzk2教育我減少和摺疊之間的差異。我甚至在這裏繼續閱讀更多細節:https://stackoverflow.com/questions/25158780/difference-between-reduce-and-foldleft-fold-in-functional-programming-particula – AjahnCharles