Kotlin如何遍历Student类嵌套Course属性获取最高课程成绩
解决方案
首先提下你原有代码的小问题:你的Student类构造参数已经声明了var name: String,类内部又重复定义了同名的name属性,会覆盖构造传入的数值,建议调整删除重复定义。
方案1:手动枚举Course属性(推荐)
这种方式无额外依赖、性能最高,适合课程属性固定的场景,代码如下:
val highestScore = listOf( studentData.Math, studentData.English, studentData.Spanish ) .filterNotNull() // 过滤未选课的空属性 .mapNotNull { it.courseGrade } // 过滤未录入成绩的课程 .maxOrNull() // 无有效成绩时返回null,可加 ?: 0 设置默认值
方案2:反射遍历属性(适合属性频繁新增的场景)
如果后续会频繁新增不同课程的Course类型属性,可以用Kotlin反射自动筛选,首先需要在项目依赖中引入Kotlin反射库:implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
之后实现代码如下:
import kotlin.reflect.full.memberProperties import kotlin.reflect.full.returnType val highestScore = Student::class.memberProperties // 筛选所有返回值为Course类型的属性 .filter { it.returnType.classifier == Course::class } // 从实例中取出属性值并转型 .map { it.get(studentData) as? Course } .filterNotNull() .mapNotNull { it.courseGrade } .maxOrNull()
注意:如果Course存在子类,需要把筛选逻辑调整为兼容子类的判断逻辑,避免子类属性被过滤。
内容的提问来源于stack exchange,提问作者James J
相关产品推荐
相关产品推荐

