【问题标题】:how to filter list base on another list in kotlin/java?如何根据 kotlin/java 中的另一个列表过滤列表?
【发布时间】:2019-01-17 19:58:17
【问题描述】:

我有两种类型FooApiFooModel

class FooApi (var aId) 
class FooModel(var mId)

是一种简化下面基于FooApi 列表过滤FooModel 列表的函数的方法:

fun f(fooModelList: List<FooModel>, fooApiList: List<FooApi>) : List<FooModel> {
  return fooModelList.filter { fooApiList.map { it.aId }.contains ( it.mId ) }
}

【问题讨论】:

    标签: list filter kotlin


    【解决方案1】:

    我觉得没问题。我只会改变一些小事情(虽然不是必需的),所以它最终会像下面这样:

     fun List<FooModel>.f(fooApiList: List<FooApi>) = filter { m -> fooApiList.any { it.aId == m.mId } }
    

    我这样做的一些原因:

    • 我认为过滤总是应用于FooModels 的列表,对吧? (这就是扩展函数将类型缩小到List&lt;FooModel&gt;的原因)
    • 你对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 }
    

    【讨论】:

    • 如果我使用 != 这将不起作用。有没有办法使用它?
    • 相交扩展功能。也许必须使用 filterNot?
    • 但这并不是真正的十字路口,是吗?
    • 是的,我写了一个新的函数,与filterNot调用不同(它是一样的,只是将filter更改为filterNot)。如果您愿意,可以将其添加到您的回复中,以便对更多人有所帮助!
    • 可以在星期一测试它..你仍然有两个函数调用..filterNot..any.. ==filter..none..==应该没有区别..
    【解决方案2】:

    我会做类似的事情

    val apiList = listOf(FooApi(1), FooApi(2), FooApi(3))
    val modelList = listOf(FooModel(1), FooModel(3))
    
    val output = apiList.flatMap { api -> modelList.filter { api.id == it.id }}
    

    输出作为输出

    [FooModel(id=1), FooModel(id=3)]

    我不知道差异是否显着......

    【讨论】:

    • 将模型平面映射到 api 不会生成模型列表。切换变量。
    • @EugenPechanec 哎呀当然。答案已编辑,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多