【问题标题】:Generate a list with lambdas in kotlin在 kotlin 中生成带有 lambda 的列表
【发布时间】:2020-09-24 13:10:08
【问题描述】:

我是 Kotlin 和 lambdas 的新手,我正在努力理解它。我正在尝试生成一个包含 100 个随机数的列表。 这有效:

private val maxRandomValues = (1..100).toList()

但我想做这样的事情:

private val maxRandomValues = (1..100).forEach { RandomGenerator().nextDouble() }.toList()

但这不起作用。我试图弄清楚如何使用生成到forEach 中的值在toList() 中使用

【问题讨论】:

  • 您的示例的问题是forEach 没有返回值。在@Sergey Rybalkin 的回答中,他们使用map

标签: lambda kotlin


【解决方案1】:

最好使用kotlin.collections 函数来执行此操作:

List(100) {
    Random.nextInt()
}

根据Collections.kt

inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)

也可以像您的情况一样使用范围生成:

(1..100).map { Random.nextInt() }

您不能使用forEach 的原因是它返回Unit(有点像Java、C# 等中的void)。 map 操作 Iterable(在本例中为从 1 到 100 的数字的 range)将它们映射到不同的值。然后它返回一个包含所有这些值的列表。在这种情况下,使用上面的 List 构造函数更有意义,因为您并不是真正“映射”这些值,而是创建一个列表

【讨论】:

  • 我使用了 List(100){Random.nextInt()} 语句。我不明白这种结构(集合构造函数和主体)的起源是什么。我从 java 的冗长中跳了出来,完全迷失了。
  • @Killrazor 让我们逐步检查: 1. List(10,(index: Int) -> { index*index })
  • @Killrazor kotlin 允许省略 2. List(10, { index*index })
  • @Killrazor 如果它是 lambda 3,则可以将最后一个参数移出 () 大括号: List(10) { index*index }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多