给出两节课:

data class Foo(val id: Int, val foo: String)
data class Bar(val id: Int, val fId: Int, val bar: String)

以及每一项的项目列表:

val foos: List<Foo>
val bars: List<Bar>

如果Foo中的id与Bar中的fId匹配,我想将foos的列表与bars相交.

现在我使用的是:

val actual = foos.filter {
  bars.any { b -> b.fId == it.id }
}

因为我经常使用这个模式,这基本上只是一个交集,我以为Kotlin中有一个std方法,但找不到.我希望:

val actual = foos.intersect(bars, { (f, b) -> b.fId == f.id })

因为我找不到任何东西,所以我添加了一个扩展方法:

fun<T, U> List<T>.intersect(list2: List<U>, p: (a: T, b: U) -> Boolean): List<T> = 
  this.filter { list2.any { other -> p(it, other) } }

在对此进行大量引用之前,我想仔细判断一下我正在寻找的东西是否有不同的名称,以及我是否在寻找错误的方法.

推荐答案

如果有很多Bar,那么首先将它们的fID放入一个集合中可能会更有效,因为Set.contains比扫描列表更有效.也许是这样的:

val idsToRetain = bars.mapTo(mutableSetOf()) { it.fId }
val filtered = foos.filter { it.id in idsToRetain }

Kotlin相关问答推荐

了解Kotlin函数

如何在Kotlin中为两个数据类创建可重用的方法?

使用另一个对象的列表创建对象

我可以更改方法中泛型类的类型参数边界吗?

为什么我的通用Kotlin函数中的这个转换未经判断?

使用 Kotlin 的 Springboot 中缺少 ResponseEntity 正文属性

多次运行espresso测试

TestContainers PostgreSQLContainer 与 Kotlin 单元测试:Not enough information to infer type variable SELF

是否可以通过超时暂停协程?

retrofit 响应代码 405 并带有消息method not allowed here

Kotlin - mutableMapOf() 会保留我输入的顺序

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

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

API 26 上未显示 Android 通知

使用 Kotlin 创建自定义 Dagger 2 范围

我们如何在Java注释声明中引用Kotlin常量?

接口中的属性不能有支持字段

项目不会使用 Kotlin 1.1.3 构建

为什么 Kotlin 会收到这样的 UndeclaredThrowableException 而不是 ParseException?

如何判断数据是否插入到房间数据库中