如果函数在获取大小之前先执行,那么我认为这将是低效的,因为你只是获取返回列表的大小,其中元素的数量无论如何都是不变的(我的意思是列表不允许元素添加,所以返回列表的大小应该是恒定的)。
对于上下文,我想保存一个返回列表大小的引用,作为稍后if条件中的限定,这样如果我以编程方式更改列表元素的数量,我不需要手动更改“限定”大小,它是一个常量。
我担心如果我将上述格式应用到代码中,它将成为一种不好的做法,一种牺牲性能的简洁代码。
例如:
class Sampler {
// notice this is var
var sampleList = initializeList()
// ...
companion object {
private fun initializeList(): List<Int> =
listOf(
// these functions may return differently later
anObject.getNumber(1),
anotherObject.getInt(2),
yetAnotherObject.getInteger(3)
// can be programmatically added later
)
fun sampleMethod(numberToBeCompared) {
// I don't want to do this: numberToBeCompared == QUALIFIED_LIST_CONSTANT
if (numberToBeCompared == initializeList().size)
println("do something")
// ...
}
}
}
1条答案
按热度按时间xlpyo6sf1#
存储一个
List<() -> Int>
怎么样?也就是说,将列表中元素的每个表达式转换为一个“thunk”,当调用时,返回元素:由于这只是一堆lambda表达式,因此可以非常快速地对其进行评估。
然后
initializeList
可以实现为将每个元素Map到其调用的结果:要获取大小,只需获取
listOfThunks.size
,它不调用任何lambda表达式,也不调用initializeList
。