假设我有一个30k大小的列表,我想对列表中所有可能的对执行操作。所以我有:
list.asSequence().flatMap { i ->
list.asSequence().map { j -> /* perform operation here */ }
}
问题1: 有什么我可以作为替代品使用吗? (比如应用函子)。
我还注意到这个flatMap-map操作比命令式循环版本慢得多。 (也许是因为关闭?)
for(i in list){
for(j in list){
}
}
问题2:有没有办法提高flatMap / map版本的性能?
答案 0 :(得分:2)
一些影响绩效的替代方案:
flatMap
/ map
解决方案慢。 : - ( forEach
/ forEach
:由于您只是想对每对执行操作,因此您实际上不需要使用flatMap
或map
来转换列表,以便您可以使用forEach
/ forEach
代替:
list.forEach { i ->
list.forEach { j -> /* perform operation here */ }
}
for
/ for
解决方案略快。 : - )如果您确实需要转换列表,则flatMap
/ map
解决方案似乎是最佳解决方案。
答案 1 :(得分:1)
在回答问题2时,我们正在考虑添加flatMap
重载,这不会为外部集合/序列中的每个元素创建闭包:https://youtrack.jetbrains.com/issue/KT-8602
但是如果你想对每一对执行一些副作用,而不是改变序列,我建议坚持使用for
- 循环或内联forEach
lambdas,实际上是一样的。