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

时间:2017-06-24 16:05:26

标签: collections filter kotlin

如果我在Kotlin中有一个对象的集合,是否有一种快速的方法来获取这些对象的某个属性的集合?我看了一下collection operations for Kotlin的清单,但没有什么能让我感到高兴(但我可能忽视了一些事情)

在python中,它类似于:

[person.name for person in persons]

我更喜欢使用收藏功能而不是:

var nameMap = mutableListOf<String>()
persons.forEach{person -> nameMap.add(person.name)}

我非常缺乏过滤/ lambda函数以及除列表理解之外的任何知识,所以如果这是一个简单的问题就道歉

3 个答案:

答案 0 :(得分:40)

在Kotlin这很容易做到:

//           v--- the variable type can be removed
var nameMap: MutableList<String> = persons.map { it.name }.toMutableList();

IF 你想要一个不可变的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);

答案 1 :(得分:7)

如果要映射模型,请执行此操作。

var nameMap: List<Model> = persons.map { Model(it.name,it.number) };

答案 2 :(得分:0)

选项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)