如何定义指定data class的集合?需支持按指定方式调用用户
定义Data Class集合并实现用户调用功能
嘿,我来帮你梳理下这个问题!首先咱们先定义一个典型的User Data Class作为基础示例:
data class User( val id: Int, val username: String, val email: String, val age: Int )
一、选择合适的集合类型
根据你调用用户的需求,选对应的集合:
- List
/ MutableList :适合需要按顺序存储、遍历所有用户的场景,比如展示用户列表。 - Map<Int, User>:如果经常需要按
id快速查找用户,用Map把id作为key,查找效率是O(1),比List遍历快很多。 - Set
:如果要避免重复用户(Data Class自动重写了equals和hashCode,所以相同属性的User会被视为重复),可以用Set。
举几个初始化的例子:
// 初始化一个不可变的用户列表 val userList: List<User> = listOf( User(1, "Alice", "alice@example.com", 25), User(2, "Bob", "bob@example.com", 30), User(3, "Charlie", "charlie@test.com", 28) ) // 初始化一个按id映射的用户Map val userMap: Map<Int, User> = userList.associateBy { it.id }
二、实现指定方式调用用户的功能
下面针对几种常见的调用需求,给出具体实现:
1. 按ID查找单个用户
如果用List,需要遍历查找;用Map的话直接通过key获取:
// 用List查找 fun findUserByIdInList(list: List<User>, userId: Int): User? { return list.firstOrNull { it.id == userId } } // 用Map查找(更高效) fun findUserByIdInMap(map: Map<Int, User>, userId: Int): User? { return map[userId] } // 调用示例 val alice = findUserByIdInList(userList, 1) val bob = findUserByIdInMap(userMap, 2)
2. 按条件筛选多个用户(比如年龄大于28、邮箱域名是example.com)
可以用Kotlin的集合操作符filter:
// 筛选年龄大于28的用户 fun getUsersOlderThan(list: List<User>, age: Int): List<User> { return list.filter { it.age > age } } // 筛选邮箱属于example.com的用户 fun getUsersWithExampleEmail(list: List<User>): List<User> { return list.filter { it.email.endsWith("@example.com") } } // 调用示例 val olderUsers = getUsersOlderThan(userList, 28) // 返回Bob val exampleEmailUsers = getUsersWithExampleEmail(userList) // 返回Alice和Bob
3. 按用户名模糊匹配
用contains或者startsWith/endsWith来实现模糊查找:
fun searchUsersByUsername(list: List<User>, keyword: String): List<User> { return list.filter { it.username.contains(keyword, ignoreCase = true) } } // 调用示例 val usersWithA = searchUsersByUsername(userList, "a") // 返回Alice和Charlie(因为Charlie包含a)
4. 用扩展函数让调用更优雅
你可以给集合类型写扩展函数,这样调用起来更自然,比如:
// 给List<User>加扩展函数,按id查找 fun List<User>.findById(userId: Int): User? { return this.firstOrNull { it.id == userId } } // 调用示例 val charlie = userList.findById(3)
三、进阶:自定义用户集合类
如果你的业务逻辑很复杂,比如需要频繁做特定的用户操作,可以自定义一个集合类,封装所有相关功能:
class UserCollection(private val users: List<User>) { // 按id查找 fun getUserById(userId: Int): User? = users.firstOrNull { it.id == userId } // 按年龄分组 fun groupUsersByAge(): Map<Int, List<User>> = users.groupBy { it.age } // 获取所有用户名 fun getAllUsernames(): List<String> = users.map { it.username } } // 使用示例 val userCollection = UserCollection(userList) val groupedByAge = userCollection.groupUsersByAge()
这样所有和用户集合相关的操作都封装在一个类里,代码更整洁,也方便维护。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

