我觉得没问题。我只会改变一些小事情(虽然不是必需的),所以它最终会像下面这样:
fun List<FooModel>.f(fooApiList: List<FooApi>) = filter { m -> fooApiList.any { it.aId == m.mId } }
我这样做的一些原因:
- 我认为过滤总是应用于
FooModels 的列表,对吧? (这就是扩展函数将类型缩小到List<FooModel>的原因)
- 你对fooApiList的映射对象不感兴趣,所以我用
any代替;还有一个好处是,现在比较的两个值彼此相邻
- 总结一切都很容易,你甚至可以省略方法体(因此返回类型、返回语句等)
不过,这和你已经做的几乎一样...只是代码少了一点和重新排列...顺便调用它看起来像:
val listA : List<FooModel> = TODO()
val listB : List<FooApi> = TODO()
val containedList = listA.f(listB)
如果您更频繁地需要这样的构造,也许以下更通用的解决方案会有所帮助:
fun <T, U> List<T>.intersect(uList: List<U>, filterPredicate : (T, U) -> Boolean) = filter { m -> uList.any { filterPredicate(m, it)} }
你也可以像这样使用:
val containedList = listA.intersect(listB) {
a, b -> a.aId == b.mId
}
那么你的f 甚至可能看起来像:
fun List<FooModel>.f(fooApiList: List<FooApi>) = intersect(fooApiList) { a, b -> a.mId == b.aId }