【问题标题】:How many collections are created while running the code below in kotlin?在 kotlin 中运行以下代码时会创建多少个集合?
【发布时间】:2021-01-20 11:30:49
【问题描述】:

允许我们以函数式样式处理集合的所有集合扩展函数都被定义为内联函数。这意味着它们的主体是在字节码而不是函数调用中生成的。查看声明我们可以注意到的另一件事是这些函数返回新集合。例如,过滤器创建一个包含结果的新集合并返回它。如何计算创建了多少集合?示例:运行以下代码时创建了多少个集合?

val list = listOf(1, 2, 3)
val maxOddSquare = list
     .map{it * it}
     .filter{it % 2 == 1}
     .max() 

【问题讨论】:

    标签: kotlin collections


    【解决方案1】:

    三个。让我们计算所有中间集合。首先,我们创建一个包含所有元素的初始列表。然后当我们调用 map 时,map 会创建一个新的集合并将其作为结果返回。然后我们调用过滤器,过滤器再次创建一个新集合并返回它。最后,我们调用 max ,它只返回值,这使得它为 3 作为答案。对集合使用简单操作时,会创建所有中间集合。

    val list = listOf(1, 2, 3) // [1, 2, 3]
    val maxOddSquare = list
         .map{it * it}         // [1, 4, 9]
         .filter{it % 2 == 1}  // [1, 9]
         .max() 
    

    【讨论】:

      【解决方案2】:

      作为 Anvar already answered 正确,创建了三个集合。它与内联代码无关。这只是保存了方法调用,但无论如何都会创建集合。 创建集合也不意味着包含的对象是重复的。所有三个集合都指向相同的对象,因此这可能没有您想象的那么昂贵。

      如果您想要与 Java Streams 中相同的行为,您可以使用 Kotlin 中的序列,它提供所有相同的方法(重新调整序列,而不是集合):

      val list = listOf(1, 2, 3)
      val maxOddSquare = list
          .asSequence()
          .map { it * it }
          .filter { it % 2 == 1 }
          .max()
      

      PS:max() 已弃用,您应该改用maxOrNull()

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 2017-03-06
        • 2022-08-23
        • 2014-07-08
        • 1970-01-01
        • 2020-09-12
        • 2012-12-09
        • 2019-09-19
        • 2014-12-08
        相关资源
        最近更新 更多