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

The*_*Fox 9 lambda android list kotlin

我有一个类人:

class Person(var fullName: String, var nickname: String, var age: Int)
Run Code Online (Sandbox Code Playgroud)

在我的代码中,有时我有一个 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")
Run Code Online (Sandbox Code Playgroud)

现在我想通过使用 lambda 来获得一个只有 Bob 和 Emily 的 List,但我不确定在 Kotlin 中我会如何处理它。

var invitedPeople: List<Person> = // a lambda that results in a list containing only Bob and Emily's objects
Run Code Online (Sandbox Code Playgroud)

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

这在 Kotlin lambda 中甚至可能吗?

Ous*_* D. 13

在 C# 中,你会这样做:

people.Where(p => invitedToParty.Any(s => s == p.nickname));
Run Code Online (Sandbox Code Playgroud)

同样在 Kotlin 中,你会使用filterwhich is likeWhereany代表它自己:

people.filter { p -> invitedToParty.any { it == p.nickname } }
Run Code Online (Sandbox Code Playgroud)

或使用contains

people.filter { invitedToParty.contains(it.nickname) }
Run Code Online (Sandbox Code Playgroud)


Tod*_*odd 8

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

val invitedPeople: List<Person> = people.filter { it.nickname == "bob" || it.nickname == "emily" }
Run Code Online (Sandbox Code Playgroud)

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

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