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,这实际上是相同的。
性能影响的一些替代方案:
- com.google.common.collect.Sets.cartesianProduct(java.util.Set …) :“按顺序从每个给定集合中选择一个元素,返回每个可能的列表;'n元笛卡儿产品 “的集合。”
- 这要求您的列表元素是唯一的。 如果他们不是那么你就必须包裹每个元素在一个独特的对象,以便他们都可以被添加到输入集。
- 然而,在我的测试中,我发现它比
flatMap
/map
解决方案要慢。 🙁
-
forEach
/forEach
:因为你只是想在每一对执行一个操作,那么你实际上并不需要使用flatMap
或map
来转换列表,所以你可以使用forEach
/forEach
来代替:list.forEach { i -> list.forEach { j -> /* perform operation here */ } }
- 在我的测试中,我发现这比
for
/for
解决方案稍快。 🙂
- 在我的测试中,我发现这比
如果你确实需要改变列表,那么你的flatMap
/ map
解决方案似乎是最好的解决方案。