【问题标题】:Kotlin - filtering a list of objects by comparing to a list of propertiesKotlin - 通过与属性列表进行比较来过滤对象列表
【发布时间】:2019-05-25 21:30:48
【问题描述】:

我有一个类人:

class Person(var fullName: String, var nickname: String, var age: Int)

在我的代码中,有时我有一个 Person 对象列表和一个昵称列表。

var people: List<Person> = listOf(
  Person("Adam Asshat", "dontinviteme", 21),
  Person("Bob Bowyer", "bob", 37),
  Person("Emily Eden", "emily", 22)
)

var invitedToParty: List<String> = listOf("bob", "emily")

现在我想通过使用 lambda 得到一个只有 Bob 和 Emily 的列表,但我不知道如何在 Kotlin 中进行。

var invitedPeople: List<Person> = // a lambda that results in a list containing only Bob and Emily's objects

在 C# 中,我可能会使用 LINQ 和 .where() 方法与 == any() 结合使用,但 Kotlin 似乎没有我发现的类似内容。

这在 Kotlin lambda 中是否可行?

【问题讨论】:

    标签: android list lambda kotlin


    【解决方案1】:

    在 C# 中你会这样做:

    people.Where(p => invitedToParty.Any(s => s == p.nickname));
    

    同样地,在 Kotlin 中,您会使用 filter,这就像 Whereany 自己说话:

    people.filter { p -> invitedToParty.any { it == p.nickname } }
    

    或使用contains:

    people.filter { invitedToParty.contains(it.nickname) }
    

    【讨论】:

    • 为什么不简单地people.filter { invitedToParty.contains(it.nickname) }
    • @Joffrey 我想也可以这样做。已更新以适应您的评论。
    • 谢谢,事实上,我刚刚意识到in 运算符在 kotlin 中有更多惯用语:people.filter { it.nickname in invitedToParty }
    • @Joffrey 同意,肯定有几种方法可以解决这个问题,我只是想我会展示filter + any 方法,因为这是 OP 在 C# 中熟悉的一种方法。尽管如此,提出更好的解决方案确实很好。谢谢!
    • 感谢您的建议,青峰和乔佛里。我总是乐于学习多种方法来完成某事,我会在回到家用笔记本电脑后立即尝试,然后接受您的回答。
    【解决方案2】:

    您可以使用.filter() 函数来执行此操作:

    val invitedPeople: List<Person> = people.filter { it.nickname == "bob" || it.nickname == "emily" }
    

    或者你可以基于集合来做这个:

    val invitedPeople: List<Person> = people.filter { it.nickname in setOf("bob", "emily") }
    

    【讨论】:

    • 基于集合似乎最适合我的目的;您的第一种方法是硬编码的,这不是我实际问题所需要的。谢谢
    【解决方案3】:

    你可以这样做:

    val invitedPeople: List<Person> = people.filter { invitedToParty.contains(it.nickname) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2017-06-14
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多