如何通过排除T中的属性将List转换为新的List . 例如,如果User数据类有10个属性,我需要将List转换为新的List,而User中没有一个特定的属性 . 列表数据类用户的新列表(val name:String,val age:Int)
var userList = mutableListOf<User>() var nameList= userList.map { it.name }
如果要创建的List没有属性'age' . 喜欢
var withoutAgeList
在你的第一个例子中:
问题是“ nameList 的类型是什么?”有一个简单的答案: List<String> . 那么让我问你一个类似的问题: withoutAgeList 的类型是什么?这个问题的答案可以回答你的问题 .
nameList
List<String>
withoutAgeList
也许没有age属性的用户是一个单独的 AgelessUser 类,这意味着 withoutAgeList 的类型为 List<AgelessUser> . 在这种情况下,我建议构造函数或工厂函数从 User 构建 AgelessUser ,你想要其中一个:
AgelessUser
List<AgelessUser>
User
val withoutAgeList = userList.map { AgelessUser(it) } // constructor val withoutAgeList = userList.map { agelessUserOf(it) } // factory
或者, User 中的 age 属性可能是可空的且不可变的,并且您希望将没有年龄的用户表示为常规 User ,其中 age=null . 在这种情况下,您可以复制用户并覆盖年龄字段
age
age=null
// TODO: pass all the other fields too val withoutAgeList = userList.map { User(it.name, null) }
假设 Users 是 data class ,我们可以避免使用 copy() 显式命名所有字段:
Users
data class
copy()
val withoutAgeList = userList.map { it.copy(age = null) }
也许age属性是可空的和可变的 - 你实际上想要改变用户而不是复制它们 . 这有点风险,我不主张这样做,除非你真的知道你在做什么 .
userList.forEach { it.age = null } // They're actually the same list! val withoutAgeList = userList
在这种简单的情况下,您可以将用户列表映射到字符串列表中:
val names: List<String> = userList.map(User::name)
或者你可以声明一个DTO并映射到后者:
class UserWithoutAge(val name: String) val usersWithoutAge: List<UserWithoutAge> = userList.map { UserWithoutAge(it.name) }
附:您不必编写显式类型
您可以使用面向对象的方法:
data class User(val name: String, val age: Int) data class UserNoAge(var name: String) { constructor(user: User) : this(user.name) } var userList = listOf(User("John", 25), User("Jane", 30)) var userNoAge: List<UserNoAge> = mutableListOf<UserNoAge>() userNoAge = userList.map{ UserNoAge(it) } println(userNoAge) // [UserNoAge(name=John), UserNoAge(name=Jane)]
3 回答
在你的第一个例子中:
问题是“
nameList
的类型是什么?”有一个简单的答案:List<String>
. 那么让我问你一个类似的问题:withoutAgeList
的类型是什么?这个问题的答案可以回答你的问题 .也许没有age属性的用户是一个单独的
AgelessUser
类,这意味着withoutAgeList
的类型为List<AgelessUser>
. 在这种情况下,我建议构造函数或工厂函数从User
构建AgelessUser
,你想要其中一个:或者,
User
中的age
属性可能是可空的且不可变的,并且您希望将没有年龄的用户表示为常规User
,其中age=null
. 在这种情况下,您可以复制用户并覆盖年龄字段假设
Users
是data class
,我们可以避免使用copy()
显式命名所有字段:也许age属性是可空的和可变的 - 你实际上想要改变用户而不是复制它们 . 这有点风险,我不主张这样做,除非你真的知道你在做什么 .
在这种简单的情况下,您可以将用户列表映射到字符串列表中:
或者你可以声明一个DTO并映射到后者:
附:您不必编写显式类型
您可以使用面向对象的方法: