Kotlin-通过与属性列表进行比较来过滤对象列表

时间:2018-12-27 23:37:26

标签: android list lambda kotlin

我有一个上课的人:

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的餐厅里甚至有可能吗?

3 个答案:

答案 0 :(得分:2)

在C#中,您需要这样做:

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

就像在科特林一样,您将使用filter,就像Where,而any本身就是这样:

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

或使用contains

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

答案 1 :(得分:1)

您可以使用.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") }

答案 2 :(得分:0)

您可以这样做:

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