嗨,我有1330个对象的列表,想应用方法并获取结果集。
val result = listOf1330
.asSequence()
.map {
someMethod(it)
}
val resultSet = result.toSet()
在没有toSet的情况下它可以正常工作,但是如果执行,则执行时间会长10倍左右。 我已经使用序列来使其更快地工作,但是结果是我需要没有重复的列表(设置)。
简单:将序列转换为设置的最有效方法是什么?
答案 0 :(得分:4)
val result = listOf1330.mapTo(HashSet()) { someMethod(it) }
使用流或序列执行转换的意义较小-您将需要集合中的所有元素,而不是几个。 mapTo
(和map
)函数在Kotlin中为inline
。这意味着代码将被替换为调用站点,不会多次创建和执行lambda。我们使用mapTo
来避免通过toSet()
函数完成的集合的第二个副本。
如果您想在多个线程中运行计算,.parallelStream()
可能会提高性能。衡量线程之间的负载平衡情况仍然是一个好主意。性能可能取决于您将其称为集合实现类
答案 1 :(得分:1)
如果您的someObject
的{{1}}或equals()
执行缓慢,或者为许多对象提供了相同的哈希码,则可以解决延迟问题,并且您也许可以改善它。
否则,如果对象很大,则延迟可能主要是由于存储所有对象必须访问的内存量所致;如果是这样,这是您要在内存中包含所有这些对象的集合时必须支付的价格。
hashCode()
使用Sequence.toSet()
。您可以尝试提供另一个LinkedHashSet
实例,例如Set
,以查看速度是否更快。 (不过,您不会获得相同的迭代顺序。)
答案 2 :(得分:0)
对于gidds
和HashSet
的效果,我同意LinkedHashSet
的答案。
LinkedHashSet的插入比HashSet昂贵;
但是,在上述用例中,我认为我们可以利用parallelStream
来提高性能。在后台,Kotlin使用Java parallelStream。
val result: Set<String> = listOf("sdgds", "fdgdfsg", "dsfgsdfg")
.parallelStream()
.map {
someMethod(it)
}.collect(Collectors.toSet())
Collectors.toSet()
使用HashSet
。因此,在插入性能方面应该没问题。