我有两个类型FooApi
和FooModel
:
class FooApi (var aId)
class FooModel(var mId)
是一种简化下面FooModel
基于FooApi
列表过滤列表的功能的方法:
fun f(fooModelList: List<FooModel>, fooApiList: List<FooApi>) : List<FooModel> {
return fooModelList.filter { fooApiList.map { it.aId }.contains ( it.mId ) }
}
在我看来还可以。我只会更改一些次要的东西(虽然不是必需的),以便最终得到如下所示的内容:
fun List<FooModel>.f(fooApiList: List<FooApi>) = filter { m -> fooApiList.any { it.aId == m.mId } }
我这样做的一些原因:
FooModel
s列表,对吗?(这是扩展功能将类型范围缩小到的原因List<FooModel>
)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 }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句