我不是普通的StackOverflow用户,既不是贡献者,也不是提出问题。 但是,我最近偶然发现了一个问题 ,试图提供帮助...并失败了。 有人指出我的答案是错误的-感谢所有这样做的人。 我认为失败是学习新事物的好时机!
在这篇文章中,我想详细介绍我进一步研究后学到的知识:有几种方法可以将Kotlin stdlib中现有集合中的元素进行组合。
与下一个结合
第一组合功能是将一个元素与另一个元素成对关联。
签名是:
fun<T>Iterable<T>.zipWithNext():List<Pair<T,T>>
这是一个有关如何使用它的简单示例:
valelements=listOf("A","B","C","D","E","F","G","H")
elements.zipWithNext().forEach{
print(it)
}
它将输出:
(A, B)(B, C)(C, D)(D, E)(E, F)(F, G)(G, H)
zipWithNext
另一种风味是:
fun<T,R>Iterable<T>.zipWithNext(
transform:(a:T,b:T)->R
):List<R>
这允许在对上运行转换函数, 例如 :
elements.zipWithNext{first,second->
"$first$second "
}.forEach{
print(it)
}
相应的输出是:
AB BC CD DE EF FG GE
使用块结合
第二个合并功能是合并特定大小的块中的元素:
fun<T>Iterable<T>.chunked(size:Int):List<List<T>>
使用方法如下:
elements.chunked(2).forEach{
print(it)
}
它产生以下内容:
[A, B][C, D][E, F][G, H]
至于先前的功能,使用转换功能还有一种替代方法:
fun<T,R>Iterable<T>.chunked(
size:Int,
transform:(List<T>)->R
):List<R>
使用它非常简单:
elements.chunked(3){
print("${it.joinToString("")} ")
}
结果是:
ABC DEF GH
最后一块的大小可能与常规块的大小不同。 如果集合大小除以块大小的余数不为0,就是这种情况。
使用滑动窗组合
最终的合并功能在集合中的元素上使用一个滑动窗口。 参数包括窗口“ width”和滑动“ step”:
fun<T>Iterable<T>.windowed(
size:Int,
step:Int=1,
partialWindows:Boolean=false
):List<List<T>>
这是前两个功能的概括:
-
zipWithNext == windowed(2, 1)
略有不同,因为zipWithNext()返回Pair,而windowed()返回List确切的等效项应该是:zipWithNext()。map {listOf(it.first,it.second)} = windowed(2,1)
-
chunked(x) == windowed(x, x, true)
作为前两个功能, windowed
还提供了转换风格。
更进一步:
翻译自: https://blog.frankel.ch/elements-combination-kotlin-collections/