2016-01-06 162 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?