2016-01-06 169 views

回答

12

對於內置操作toList()等未涉及的情況,您可以使用這樣一個事實,即收集只是一個摺疊。因此,考慮

val list: List<Pair<String, Int>> = listOf("Ann" to 19, "John" to 23) 

你可以收集到您選擇的集合與摺疊

val map: Map<String, Int> = list.fold(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second); accumulator}) 

如果再定義一個擴展功能

fun <T, R> Iterable<T>.collectTo(accumulator: R, accumulation: (R, T) -> Unit) = 
    this.fold(accumulator, { accumulator, item -> accumulation(accumulator, item); accumulator }) 

可以進一步簡化

val map2: Map<String, Int> = list.collectTo(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second) }) 

Althou在這種情況下,你當然可以使用.toMap擴展功能。

4

注:對於一些常見的情況下,你會使用Stream.collect從Java 8中,您可以在科特林已經利用現有STDLIB功能。對於那些在Kotlin中找不到的人,您可以按照@duncan的回答中所述探索創建自定義流程。添加此答案是爲了幫助您瞭解stdlib中的功能,以便您可以決定何時編寫自定義內容。它回答了問題標題「什麼是Java Stream.collect的Kotlin等價物?」

中有STDLIB爲平均值,計數,層次分明,過濾功能,發現,分組,連接,映射,最小值,最大值,分區,切片,排序,求和,向/從陣列,向/從列表,來自地圖,聯合,共同迭代,所有功能範例等等。小1行,不需要使用更復雜的Java 8語法。我認爲從內置Java 8 Collectors類中缺少的唯一東西是彙總

另一個SO郵政覆蓋這些換算公式詳細爲:What Java 8 Stream.collect equivalents are available in the standard Kotlin library?

相關問題