Kotlin flatMap - 地图

时间:2015-12-06 01:24:26

标签: kotlin

假设我有一个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版本的性能?

2 个答案:

答案 0 :(得分:2)

一些影响绩效的替代方案:

  1. com.google.common.collect.Sets.cartesianProduct(java.util.Set...):“返回可以通过按顺序从每个给定集合中选择一个元素来形成的每个可能列表;集合中的'n-ary Cartesian product'。”
    • 这要求您的列表元素是唯一的。如果它们不是那么你必须将每个元素包装在一个唯一的对象中,以便它们都可以添加到输入集中。
    • 然而,在我的测试中,我发现它比flatMap / map解决方案慢。 : - (
  2. forEach / forEach:由于您只是想对每对执行操作,因此您实际上不需要使用flatMapmap来转换列表,以便您可以使用forEach / forEach代替:

    list.forEach { i ->
        list.forEach { j -> /* perform operation here */ }
    }
    
    • 在我的测试中,我发现这比for / for解决方案略快。 : - )
  3. 如果您确实需要转换列表,则flatMap / map解决方案似乎是最佳解决方案。

答案 1 :(得分:1)

在回答问题2时,我们正在考虑添加flatMap重载,这不会为外部集合/序列中的每个元素创建闭包:https://youtrack.jetbrains.com/issue/KT-8602

但是如果你想对每一对执行一些副作用,而不是改变序列,我建议坚持使用for - 循环或内联forEach lambdas,实际上是一样的。