使用Array()构造函数声明数组的正确方法?

时间:2018-10-27 11:33:50

标签: arrays intellij-idea lambda kotlin

我知道Array()构造函数接受两个参数:数组的大小和一个函数,该函数接收数组的索引并返回该索引的值。

我已经在kotlinlang.org在线IDE中编写了一些示例程序,并这样声明和初始化了我的数组:

var array = Array(9, {i -> ' '})

大小为9的“空白”字符数组,完全用空格填充。这在kotlinlang.org编译器中可以正常工作,并且运行良好;但是,当我尝试将相同的代码导入IntelliJ-IDEA时,出现以下警告:

  

警告:Kotlin:从未使用参数'i',可以将其重命名为_

下划线字符是什么意思?它如何充当索引?将i重命名为_确实会删除警告,但是它的作用是什么?

如何正确使用Array()构造函数使用lambda表达式初始化数组? 请记住,我知道lambda表达式可以写在方括号之外,但是我还是选择包含它,因为它非常简单。

谢谢。

4 个答案:

答案 0 :(得分:0)

它说的是“警告”而不是“错误”。

Warning: Kotlin: Parameter 'i' is never used, could be renamed to _

代码可以很好地编译,只是通知您可以将未使用的lambda参数重命名为_,从而更明显地表明lambda参数是未使用的。

因此,为回答您的问题,您已正确构造了数组。但是,如果由于某种原因要使用索引来构造数组,则可以将其保留名称,并将其用于在lambda内部进行的计算,该lambda将被执行以构造数组的每个元素。例如:

val array = Array(10, { i -> i * 10  })

这将导致如下数组:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

另外要注意的是,您使用了var,这意味着您的变量array是可变的(即可以重新分配整个变量)。这可能不是您想要的,因此,除非特别需要可变变量,否则应首选val

答案 1 :(得分:0)

这只是一个警告。

在Kotlin中,如果您不使用参数,则可以将其重命名为_。它更具可读性。 对于您而言,请勿在lambda函数的右侧使用i。因此,您可以将其重命名为_

答案 2 :(得分:0)

正如其他答案所述,您的代码是正确的,但是由于您没有使用参数i,因此无需为其命名。您可以改为使用_,它只是一个占位符:它向Kotlin表示lambda接受参数,但是您并不在意。

(下划线在这里似乎不太有用,但是可以在更复杂的情况下提供帮助。例如,如果您有一个包含多个字段的大型Person类,则可以仅将其中几个与{{1} }…)

实际上,您可以进一步简化表达式!与更传统的块结构语言不同,在Kotlin中,大括号通常表示一个lambda(在函数体以及for ((name, _, _, age) in persons)if分支等情况下除外),即使没有when也是如此。在这里,Kotlin可以推断参数的数量和类型。因此,您可以完全删除参数和箭头,只需使用:

->

答案 3 :(得分:0)

下面的所有定义都创建相同的数组。 Kotlin(和IntelliJ)不鼓励使用冗余代码,因此_i“更好”(因为未使用i),“ {nothing”比_更好。最后,IntelliJ鼓励最后一个参数lambda位于单独的块中-如第四个示例所示:

Array(9, { i -> ' ' })
Array(9, { _ -> ' ' })
Array(9, { ' ' })
Array(9) { ' ' }