如何通过排除Kotlin中的特定属性来转换自定义对象列表?

时间:2018-05-15 10:22:45

标签: collections kotlin

如何通过在T中排除属性将List转换为新列表 例如,如果User数据类有10个属性,我需要将List转换为一个新的List,而User中没有一个特定的属性。列表等新列表     data class User(val name:String,val age:Int)

var userList = mutableListOf<User>()

var nameList= userList.map { it.name }

如果要创建的列表没有属性&#39; age&#39;。像

var withoutAgeList

3 个答案:

答案 0 :(得分:3)

在你的第一个例子中:

var userList = mutableListOf<User>()
var nameList= userList.map { it.name }

问题“nameList的类型是什么?”有一个简单的答案:List<String>。那么,让我问一个类似的问题:withoutAgeList的类型是什么?该问题的答案通知您的问题的答案。

可能没有age属性的用户是单独的AgelessUser类,这意味着withoutAgeList的类型为List<AgelessUser>。在这种情况下,我建议使用构造函数或工厂函数从AgelessUser构建User,并且您需要其中一个:

val withoutAgeList =  userList.map { AgelessUser(it) } // constructor
val withoutAgeList =  userList.map { agelessUserOf(it) } // factory

或者,age中的User属性可能是可空的且不可变的,并且您希望将没有年龄的用户表示为常规User age=null。在这种情况下,您可以复制用户并覆盖年龄字段

// TODO: pass all the other fields too
val withoutAgeList =  userList.map { User(it.name, null) } 

假设Usersdata 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

答案 1 :(得分:1)

在这种简单的情况下,您可以将用户列表映射到字符串列表中:

val names: List<String> = userList.map(User::name)

或者您可以声明DTO并映射到后者:

class UserWithoutAge(val name: String)

val usersWithoutAge: List<UserWithoutAge> = userList.map { UserWithoutAge(it.name) }

P.S。您不必编写显式类型

答案 2 :(得分:0)

您可以使用面向对象的方法:

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)]