java - Guava Collections - 按字符串值数组过滤

标签 java android arraylist filtering guava

我有一个事件对象列表。每个对象都公开 getId() getter。我需要过滤集合以仅获取具有特定 id 的项目,我可以这样做:

Lists.newArrayList(Iterables.filter(ret, x->x.getCategoryId().equals(category)));

结果,我得到了新的数组,过滤为项目,其中 getCategoryId() 等于我的特定类别

到目前为止还好。问题:如果我有 String 值数组(所有类别都用作过滤器),而不是单个特定类别,该怎么办?这可能如下所示:

Lists.newArrayList(Iterables.filter(ret, x->x.getCategoryId().equals(categories.get(0)) || x.getCategoryId().equals(categories.get(1)) || ......../*To the end of the list*/));

由于我的categories列表是动态的,我需要使用动态查询来获取应用的所有||条件。做到这一点的最佳方法是什么?我可以以某种方式循环它或提供 array 作为 filter 方法的标准吗?

注意:我使用的是 Android,所以:

  • 可以使用 Java 8 lambda(如上所示)来简化语法。
  • 无法使用 Java 8 流(因为 min api 是 Android Lollipop)。这就是为什么使用 Guava 来执行过滤的原因。请不要提出任何基于 Java 8 流的灵魂。

那么,你有什么想法吗?

最佳答案

您所要做的就是构建一个 guava Predicate,因为您需要快速查找,因此首先从该数组构建一个 Set 可能会有所返回:

Set<String> set = new HashSet<>(Arrays.asList(values));   

而不是简单地替换谓词:

x -> set.contains(x.getCategoryId())

关于java - Guava Collections - 按字符串值数组过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52185355/

相关文章:

java - 让与服务器的连接始终打开

java - Java中组合爆炸的例子?

android - 在 Nexus7 上移动和缩放相机 android maps v2

java - 如何摆脱元素周围的默认白色 "space"?

java - 如何使用正则表达式从字符串中提取数字

android - Android 水波纹效果

android - 如何在 Android Studio 中显示依赖关系树?

java - 如何修复更改类似数组列表值的 android Setters?

java - 将 ArrayList<Person> 传递给新 Activity

java - for循环很慢