Kotlin中如何基于双字段过滤列表数据?编译报错如何解决?
问题解决方法
错误原因
- filter lambda语法错误:单个filter的判断逻辑只需要声明一次元素参数,你拆分了两个参数
s和t属于语法错误,同一个元素的两个字段判断直接用同一个参数引用即可 - 可空类型未处理:
GraphData里的beginningTime是Long?可空类型,直接做大小比较需要先处理空值,避免空指针风险
修改后的代码
override fun onGraphDataLoaded(data: List<GraphData>?) { Log.d("DATAITEM", data?.size.toString()) // 只需要一个参数引用当前元素,同时处理beginningTime空值,空的情况下默认不满足>0的条件 var childList: List<GraphData>? = data?.filter { s -> s.isChild && (s.beginningTime ?: 0) > 0 } var parentList: List<GraphData>? = data?.filter { s -> !s.isChild } Log.d("DATAITEM", "ChildSize"+childList?.size) Log.d("DATAITEM", "ParentSize"+parentList?.size) }
代码说明
- 去掉了多余的
let嵌套,data?后可以直接调用filter方法,无需额外包裹let - 用同一个参数
s引用当前遍历的GraphData对象,同时判断两个字段的条件 - 用
?:Elvis运算符处理beginningTime为空的情况,空值时返回0,自然不满足>0的条件,符合筛选逻辑;如果更倾向于显式判空,也可以把条件写成s.isChild && s.beginningTime != null && s.beginningTime > 0,效果完全一致
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

