如何通过元素的属性将集合转换/转换为另一个集合?

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&lt;String&gt; 这不是我的问题。此外,他没有在任何地方指定可变列表。他只是在他的解决方法中使用它。 @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)

【讨论】:

以上是关于如何通过元素的属性将集合转换/转换为另一个集合?的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组转换为虚拟 mongodb 集合

Laravel:将 Eloquent 集合转换为数组而不转换元素

如何将List集合转换成String的数组?

如何将List集合转换成String的数组?

Scala 中 10 个超赞的集合操作函数

Apache Camel 遍历列表