Kotlin:统计列表中枚举类型属性的不同值数量
Kotlin统计列表中不同属性值的数量
内置方法实现
Kotlin标准库已经提供了简洁的内置方式来实现这个需求,不需要自定义扩展函数。核心思路是提取目标属性后利用集合的去重特性统计数量:
- 最直观的写法:
// 假设你的Class列表为classes val uniqueDayCount = classes.map { it.dayOfWeek }.distinct().size
map提取所有dayOfWeek属性,distinct()去重得到唯一值列表,最后size就是不同星期的数量。
- 更高效的写法:
如果数据量较大,推荐用mapTo直接将属性存入HashSet(自动去重,且判断元素存在的时间复杂度为O(1)),避免distinct()额外创建中间列表:
val uniqueDayCount = classes.mapTo(HashSet()) { it.dayOfWeek }.size
自定义扩展函数的优化
你编写的扩展函数可以正常工作,但有几个可以优化的点:
- 无需单独维护
count变量,集合的size就是最终统计数 ArrayList.contains()的时间复杂度是O(n),换成HashSet能大幅提升性能- 空集合的判断是冗余的,空迭代器不会进入循环,最终集合
size自然为0
优化后的扩展函数可以更简洁高效:
inline fun <T, P> Iterable<T>.countUnique(block: (T) -> P): Int = mapTo(HashSet(), block).size
或者用函数式风格的fold实现:
inline fun <T, P> Iterable<T>.countUnique(block: (T) -> P): Int { return fold(HashSet<P>()) { set, element -> set.apply { add(block(element)) } }.size }
内容的提问来源于stack exchange,提问作者Leonardo Sibela
相关产品推荐
相关产品推荐

