Kotlin中如何使用带条件的Lambda表达式初始化数组?
我来帮你理清Kotlin里用Lambda初始化带条件数组的正确姿势,先从你提到的简化场景入手,再解决你实际的Item数组赋值问题~
先解决你的简化场景问题
你之前尝试的val player6 = Array(10){(it<10) -> testNumbers[it]}写法有两个明显问题:
- 语法错误:Lambda表达式里不需要额外写
->,Array的初始化Lambda默认接收索引参数(可以用it或者显式命名),直接写返回值的表达式就行。 - 逻辑问题:0到10是11个元素,所以数组长度应该是11,不是10;另外如果要取
testNumbers里的0到10元素,直接按索引取就好,不需要额外的条件判断(除非你要筛选特定值)。
正确的写法分两种情况:
- 直接生成0到10的数组:
val player6 = Array(11) { it } // it就是当前索引,从0到10
- 从已有的
testNumbers数组中取前11个元素(对应0到10):
val player6 = Array(11) { testNumbers[it] }
如果你的需求是筛选testNumbers中小于10的元素,那应该用filter而不是Array初始化:
val player6 = testNumbers.filter { it < 10 }.toTypedArray()
再解决你的Item数组赋值问题
首先先优化一下你的Item类——你写的init块完全多余,主构造函数里的var参数会自动给类属性赋值,所以可以简化成:
class Item(var color: String, var numValue: Int, var drawableID: Int)
接下来,你不需要先创建一个全是默认值的数组再赋值,直接用Array的初始化Lambda,根据索引的不同条件生成对应的Item对象即可。结合你提到的104个Item和53个drawableID(刚好是2倍关系),这里给你一个通用的实现模板(你可以根据实际规则调整条件逻辑):
// 假设drawablesIDs是已定义的包含53个资源ID的数组 val myItemClassArray = Array(104) { index -> // 计算当前Item对应的drawable索引:前53个用0-52,后53个重复用0-52 val drawableIdx = index % 53 // 根据索引范围设置颜色(示例规则,替换成你的实际需求) val color = if (index < 53) "red" else "black" // 根据索引设置数值(示例规则,替换成你的实际逻辑) val numValue = (drawableIdx + 1) // 比如每个drawable对应1-53的数值,两个Item数值相同 // 返回初始化好的Item对象 Item(color, numValue, drawablesIDs[drawableIdx]) }
纠正你之前的Lambda写法错误
你尝试的val test = Array(28){if(i<13)-> examples[i]}写法有两个核心问题:
- 语法错误:Lambda内部不需要
->,正确的写法是Array(28) { i -> if (i < 13) examples[i] else /* 这里必须写else分支的返回值 */ } - 逻辑漏洞:
Array的初始化Lambda要求每个索引都必须返回一个元素,所以if必须搭配else,否则当i >=13时没有返回值,编译器会报错。
比如如果你的需求是前13个用examples[i],后15个用默认值,写法应该是:
val test = Array(28) { i -> if (i < 13) examples[i] else Item("", -99, -99) // 必须有else分支 }
内容的提问来源于stack exchange,提问作者Bilge Kaan Atay
相关产品推荐
相关产品推荐

