如何通过元素的属性将集合转换/转换为另一个集合?
Posted
技术标签:
【中文标题】如何通过元素的属性将集合转换/转换为另一个集合?【英文标题】:How to convert/transform a collection to another collection by element's property? 【发布时间】:2017-11-28 00:43:55 【问题描述】:如果我在 Kotlin 中有一个对象的集合,有没有一种快速的方法来获取这些对象的某个属性的集合?我查看了collection operations for Kotlin 的列表,但没有什么特别突出的(但我可能忽略了一些东西)
在python中类似于:
[person.name for person in persons]
而且我更喜欢使用集合函数而不是这样做:
var nameMap = mutableListOf<String>()
persons.forEachperson -> nameMap.add(person.name)
我非常缺乏过滤/lambda函数以及列表理解以外的任何知识,所以如果这是一个简单的问题,请道歉
【问题讨论】:
【参考方案1】:在 Kotlin 中很容易做到:
// v--- the variable type can be removed
var nameMap: MutableList<String> = persons.map it.name .toMutableList();
如果你想要一个不可变的List
,它可以简化如下:
// v--- the variable type can be removed
var nameMap: List<String> = persons.map it.name ;
或改用function reference expression:
var nameMap = persons.map(Person::name);
【讨论】:
为什么要使用可变列表? @marstran 因为您的问题定义为MutableList<String>
这不是我的问题。此外,他没有在任何地方指定可变列表。他只是在他的解决方法中使用它。
@Parker 您可以在此处查看更多详细信息:kotlinlang.org/docs/reference/…。
@Pavlus 嗨,但他并没有说他不想进一步操作 list。所以我提供了 2 种列表类型。【参考方案2】:
如果您想映射模型,请执行此操作。
var nameMap: List<Model> = persons.map Model(it.name,it.number) ;
【讨论】:
【参考方案3】:选项 1:
inline fun <reified T, Y> MutableList<T>.listOfField(property: KMutableProperty1<T, Y?>): MutableList<Y>
val yy = ArrayList<Y>()
this.forEach t: T ->
yy.add(property.get(t) as Y)
return yy
用法:
val serviceIds = services.listOfField(ServiceModel::id)
选项 2:
var serviceIds: MutableList<String> = services.map it.id .toMutableList()
选项 3:
函数参考
var serviceIds = services.map(Person::id)
【讨论】:
以上是关于如何通过元素的属性将集合转换/转换为另一个集合?的主要内容,如果未能解决你的问题,请参考以下文章