是否有一个有效的替代方案(在Kotlin中)来替代这种代码格式:(< functionReturningAList>).size?

knsnq2tg  于 2023-03-24  发布在  Kotlin
关注(0)|答案(1)|浏览(122)

如果函数在获取大小之前先执行,那么我认为这将是低效的,因为你只是获取返回列表的大小,其中元素的数量无论如何都是不变的(我的意思是列表不允许元素添加,所以返回列表的大小应该是恒定的)。
对于上下文,我想保存一个返回列表大小的引用,作为稍后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")

                // ...

            }
        }
    }
xlpyo6sf

xlpyo6sf1#

存储一个List<() -> Int>怎么样?也就是说,将列表中元素的每个表达式转换为一个“thunk”,当调用时,返回元素:

val listOfThunks =
    listOf(
        { anObject.getNumber(1) },
        { anotherObject.getInt(2) },
        { yetAnotherObject.getInteger(3) }
        // can be programmatically added later
    )

由于这只是一堆lambda表达式,因此可以非常快速地对其进行评估。
然后initializeList可以实现为将每个元素Map到其调用的结果:

private fun initializeList(): List<Int> = listOfThunks.map { it() }

要获取大小,只需获取listOfThunks.size,它不调用任何lambda表达式,也不调用initializeList

相关问题