Как преобразовать пользовательский список объектов, исключив определенное свойство в Kotlin? - PullRequest
0 голосов
/ 15 мая 2018

Как преобразовать Список в новый Список, исключив свойство в T. Например, если у класса данных User есть 10 свойств, мне нужно преобразовать List в новый список без одного конкретного свойства в User. Новый список, как список класс данных Пользователь (имя val: String, val возраст: Int)

var userList = mutableListOf<User>()

var nameList= userList.map { it.name }

Если список создается без свойства age. Как

var withoutAgeList

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вы можете использовать объектно-ориентированный подход:

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)]
0 голосов
/ 07 июня 2018

В вашем первом примере:

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

Предполагая, что 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
0 голосов
/ 15 мая 2018

В таком простом случае вы можете отобразить список пользователей в список строк:

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. вам не нужно писать явный тип

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...