Kotlin flatMap – 地图

假设我有一个大小为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,我们正在考虑添加flatMap重载,它不为外部集合/序列中的每个元素创建闭包: https : //youtrack.jetbrains.com/issue/KT-8602

但是如果你想对每一对执行一些副作用,而不是转换序列,我建议坚持使用循环或内联for each lambda,这实际上是相同的。

性能影响的一些替代方案:

  1. com.google.common.collect.Sets.cartesianProduct(java.util.Set …) :“按顺序从每个给定集合中选择一个元素,返回每个可能的列表;'n元笛卡儿产品 “的集合。”
    • 这要求您的列表元素是唯一的。 如果他们不是那么你就必须包裹每个元素在一个独特的对象,以便他们都可以被添加到输入集。
    • 然而,在我的测试中,我发现它比flatMap / map解决方案要慢。 🙁
  2. forEach / forEach :因为你只是想在每一对执行一个操作,那么你实际上并不需要使用flatMapmap来转换列表,所以你可以使用forEach / forEach来代替:

     list.forEach { i -> list.forEach { j -> /* perform operation here */ } } 
    • 在我的测试中,我发现这比for / for解决方案稍快。 🙂

如果你确实需要改变列表,那么你的flatMap / map解决方案似乎是最好的解决方案。