Kotlin最有效的方式设置顺序

时间:2019-03-14 12:15:13

标签: kotlin sequence

嗨,我有1330个对象的列表,想应用方法并获取结果集。

        val result = listOf1330
            .asSequence()
            .map {
                someMethod(it)
            }
        val resultSet = result.toSet()

在没有toSet的情况下它可以正常工作,但是如果执行,则执行时间会长10倍左右。 我已经使用序列来使其更快地工作,但是结果是我需要没有重复的列表(设置)。

简单:将序列转换为设置的最有效方法是什么?

3 个答案:

答案 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)

对于giddsHashSet的效果,我同意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。因此,在插入性能方面应该没问题。