【问题标题】:Kotlin most efficient way sequence to setKotlin 最有效的方式序列来设置
【发布时间】:2019-03-14 12:15:12
【问题描述】:

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

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

没有 toSet 也能正常工作,但如果那样的话,执行时间会长 10 倍左右。 我使用了序列来使其工作得更快,但结果我需要没有重复的列表(设置)。

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

【问题讨论】:

  • 不清楚你在问什么。如果没有 toSet(),它可能无法正常工作:代码无法编译。澄清你的问题。
  • 答案:最有效的方法是在序列上调用 toSet()。还有什么比这更有效的方法吗?
  • 为什么它不起作用,@JBNizet?在 Kotlin 中,您不需要像在 Java 中那样指定 toList()、toSet() 变体。
  • @ThalesMinussi 因为 Sequence.map() 返回的是序列,而不是集合。而且 Sequence 没有实现 Set 接口。所以你不能用序列初始化 Set 类型的变量。
  • 正如我刚才所说:创建序列没有任何作用。它是瞬时的。需要时间的是遍历序列的每个元素,通过在每个元素上调用 someMethod() 来映射它,创建一个 Set 并填充它。这一切都发生在调用toSet() 时。所以最慢的是你的方法 someMehod() (或你的 hashCode() 方法,但这不太可能)

标签: kotlin sequence


【解决方案1】:
 val result = listOf1330.mapTo(HashSet()) { someMethod(it) }

使用流或序列来实现转换的意义不大 - 您将需要集合中的所有元素,而不是多个元素。 mapTo(和 map)函数在 Kotlin 中是 inline。这意味着代码将被替换到调用站点,它不会多次创建和执行 lambda。我们使用mapTo 来避免toSet() 函数完成的集合的第二个副本。

如果您希望在多个线程中运行计算,.parallelStream() 可能会提高性能。衡量线程之间负载平衡的好坏仍然是一个好主意。性能可能取决于您调用它的集合实现类

【讨论】:

    【解决方案2】:

    如果您的someObjectequals()hashCode() 的实现很慢,或者为许多对象提供了相同的哈希码,那么这可能是延迟的原因,您可以改进它。

    否则,如果对象很大,延迟可能主要是由于存储它们必须访问的内存量;如果是这样,如果你想要一个包含所有这些对象的集合,这就是你必须付出的代价。

    Sequence.toSet() 使用LinkedHashSet。您可以尝试提供另一个 Set 实例,例如使用toCollection(HashSet()),看看是否更快。 (不过,您不会得到相同的迭代顺序。)

    【讨论】:

      【解决方案3】:

      我同意giddsHashSetLinkedHashSet 性能的回答。

      LinkedHashSet 的插入成本比 HashSet 高;

      但是,在上述用例中,我认为我们可以利用parallelStream 来提高性能。在底层,Kotlin 使用 Java parallelStream。

      val result: Set<String> = listOf("sdgds", "fdgdfsg", "dsfgsdfg")
                  .parallelStream()
                  .map {
                      someMethod(it)
                  }.collect(Collectors.toSet())
      

      Collectors.toSet() 使用 HashSet。所以,从插入性能的角度来看,我们应该没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2023-04-02
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 2013-12-08
        • 2010-12-15
        相关资源
        最近更新 更多