面试题答案
一键面试设计思路
- 确定扩展函数的接收者:由于要对
MyDataClass
进行扩展,所以MyDataClass
作为扩展函数的接收者类型。 - 定义过滤条件:可以通过函数参数接收一个表示过滤条件的函数,这个函数以
MyDataClass
的实例为参数并返回布尔值,来决定是否保留该实例。 - 实现过滤逻辑:在扩展函数内部,根据传入的过滤条件函数对数据进行过滤。
代码实现
data class MyDataClass(val id: Int, val name: String)
fun List<MyDataClass>.filterByCondition(condition: (MyDataClass) -> Boolean): List<MyDataClass> {
return this.filter(condition)
}
使用示例:
fun main() {
val dataList = listOf(
MyDataClass(1, "Alice"),
MyDataClass(2, "Bob"),
MyDataClass(3, "Charlie")
)
val filteredList = dataList.filterByCondition { it.id > 1 }
println(filteredList)
}
对项目性能和可维护性的影响
性能影响
- 优点:利用 Kotlin 标准库中已有的
filter
函数,性能上较为高效。filter
函数采用了迭代的方式遍历集合,在遍历过程中直接生成新的符合条件的集合,避免了多次创建中间数据结构。 - 缺点:如果数据量非常大,在每次调用扩展函数时都会进行一次遍历操作,可能会带来一定的性能开销。但这种开销是符合常规集合操作的性能模型的,并且 Kotlin 的集合操作在底层有较好的优化。
可维护性影响
- 优点:
- 代码复用性高:通过扩展函数将过滤功能封装起来,在项目的多个地方可以复用此逻辑,减少了重复代码。
- 可读性增强:扩展函数的命名可以清晰地表达其功能,调用处的代码简洁明了,易于理解。例如
dataList.filterByCondition { it.id > 1 }
这样的代码,很容易明白是在对dataList
进行根据特定条件的过滤操作。 - 易于修改和扩展:如果过滤逻辑发生变化,只需要在扩展函数内部修改,而不需要在所有使用到过滤功能的地方进行修改,降低了维护成本。
- 缺点:
- 命名冲突风险:如果项目中有多个地方对
MyDataClass
进行扩展,可能会出现扩展函数命名冲突的情况,需要在命名时遵循清晰的规范,避免冲突。 - 增加代码复杂度:对于不熟悉扩展函数机制的开发者,可能需要额外的学习成本来理解和维护相关代码。
- 命名冲突风险:如果项目中有多个地方对