Intellij idea Kotlin链接收集函数的性能

Intellij idea Kotlin链接收集函数的性能,intellij-idea,kotlin,Intellij Idea,Kotlin,我是Kotlin的新手,我通过使用IDE提供的提示,在IntelliJ中解决简单的难题来学习这门语言。我写了这段代码(查找重复次数最多的数字): 改为: val currentMaxCount = numbers .map { incrementAndGetCurrentCountOf(it, tracer) } .max() ?: 0 我理解正在发生的事情。但是我想知道如果我使用IDE的建议,性能是否会变成O(2n)。这

我是Kotlin的新手,我通过使用IDE提供的提示,在IntelliJ中解决简单的难题来学习这门语言。我写了这段代码(查找重复次数最多的数字):

改为:

val currentMaxCount = numbers
            .map { incrementAndGetCurrentCountOf(it, tracer) }
            .max()
            ?: 0
我理解正在发生的事情。但是我想知道如果我使用IDE的建议,性能是否会变成O(2n)。这是我想到的。我知道理论上没有什么不同,但我想知道科特林是否使用了任何魔法来保持运行时间在O(n)。(欢迎进一步缩减代码的任何其他建议)

TL;DR

是的,这会影响性能,因为这实际上是两个独立的迭代

在这个特定的上下文中,您可以通过利用专用的
maxBy
方法来避免进行额外的迭代:

numbers.maxBy { incrementAndGetCurrentCountOf(it, tracer) } ?: 0

重要的是要记住,与Java流不同,Kotlin集合不是惰性的,所有这些奇特的方法都封装了简单的命令式实现

因此
M
chained
map
调用在乐观情况下会导致O(M*N),即使整个处理过程可能会短路,因为不需要访问所有元素:

listOf(1, 2, 3)
      .map {
          println(it)
      }.first()
这张照片是:

1
2
3
在这种情况下,重要的是要记住
asSequence
方法的存在,该方法创建一个由给定集合支持的延迟计算序列:

listOf(1, 2, 3).asSequence()
      .map {
          println(it)
      }.first()
其中打印:

1

非常感谢。我看到了maxBy的代码,它正是我正在做的(在同一个循环中转换并跟踪最大值)。但我不知道mapTo函数是如何完成我正在做的事情的。mapTo只是在变换,但我同时变换并跟踪同一循环中的max元素。这似乎在IDE建议的代码中包含了两个循环。@AndrewNessin是的,我回答了与您问题稍有不同的版本:)让我重新措辞that@AndrewNessin事实上,谢谢你的提问。我将把整篇文章专门用于这个主题,并将其涵盖得更广:)查看4comprehension.com
listOf(1, 2, 3).asSequence()
      .map {
          println(it)
      }.first()
1