Kotlin:查找不在指定MutableSet中的元素的正确实现方法
解决方案
首先来说说你这里的问题出在哪:你用了schoolStudents.minus(students),但这个方法是拿schoolStudents里的元素减去students里的元素,得到的是schoolStudents中不在students里的元素,完全和你要的需求反过来了!而且minus返回的是一个Set集合,不是布尔值,这就是你看到报错的原因。
要实现「找出students中所有不在schoolStudents里的元素」,这里有两种简洁且安全的实现方式,还能处理你这两个变量都是可空的情况:
方式一:用集合的minus操作(简洁高效)
先把可空的变量处理成非空集合,再用minus做差集运算,这样直接就能得到你要的结果:
// 先把students转成非空Set,空的话就用空集合 val studentSet = students?.toSet() ?: emptySet() // 把schoolStudents转成非空Set,空的话用空集合 val schoolStudentSet = schoolStudents ?: emptySet() // 计算差集:studentSet里不在schoolStudentSet中的元素 val missingStudents = studentSet.minus(schoolStudentSet)
如果schoolStudents是null,相当于所有学生都不在里面,minus就会返回整个studentSet;如果students是null,就返回空集合,完全符合你的需求。
方式二:用filter遍历(直观灵活)
如果你想更直观地控制判断逻辑,可以用filter遍历数组元素,逐个判断是否不在schoolStudents中:
val missingStudents = students?.filter { student -> // 如果schoolStudents是null,说明没有学生在里面,所有元素都符合条件 schoolStudents?.contains(student) != true } ?: emptyList()
这个写法的逻辑很清晰:遍历每个学生,只要schoolStudents不包含该学生(或者schoolStudents本身是null),就把这个学生保留下来。如果students是null,直接返回空列表。
额外说明
如果你最终需要的是MutableSet<String>类型的结果,只需要在后面加个toMutableSet()就行,比如:
val missingStudentsSet = studentSet.minus(schoolStudentSet).toMutableSet()
内容的提问来源于stack exchange,提问作者NeoN
相关产品推荐
相关产品推荐

