如何基于kotlin / java中的另一个列表过滤列表?

露娜·沃尔波

我有两个类型FooApiFooModel

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 } }

我这样做的一些原因:

  • 我认为过滤始终应用于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 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何基于python中另一个列表中的元素过滤列表

如何从另一个项目列表中过滤一个项目列表?

如何使用另一个列表过滤列表?

如何基于另一个下拉选择过滤下拉列表中的选项

如何根据另一个列表过滤Python中的列表元素?

在C#中,如何使用另一个列表的StartsWith()条件过滤列表?

如何通过另一个列表过滤类列表中的元素?

如何在C#中过滤包含另一个列表的列表?

如何过滤与另一个对象列表中的某些条件不匹配的对象列表

如何在“剃刀”页面中按另一个列表过滤列表?

如何在另一个列表中过滤列表MVC LINQ

基于另一个列表对一个列表进行排序和过滤

如何制作一个下拉列表,可以被cshtml中的另一个下拉列表过滤

在R中,如何基于另一个列表限制列表的列表?

如何使用另一个列表的 id 过滤一个列表?

如何通过在另一个数组中搜索来过滤列表中的数组?

基于另一个列表的1个列表的流过滤器

Java 8-如何从另一个列表中的对象设置列表中的对象?

如何从Java中的另一个列表中获取列表

如何根据另一个工作表中的列表过滤行?(Google表格)

如何在角度过滤器中依赖另一个下拉列表

如何基于另一个列表中对象的字段值从列表中删除元素

如何检查列表是否是Java中另一个列表的子集?

如何从另一个列表中的列表中获取另一个列表中的值

基于另一个列表过滤列表的高效方法?

如何使用基于另一个列表的lambda从列表中删除元素

如何使用 LINQ 语句过滤出与另一个列表中的一个单词匹配的项目?

如果特定值不在另一个不同类型的列表中,如何过滤列表

如何在C#中使用Linq通过比较另一个列表中的值来过滤列表?