【问题标题】: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.forEach{person -> nameMap.add(person.name)}

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

【问题讨论】:

    标签: collections filter kotlin


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 2021-01-11
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        相关资源
        最近更新 更多