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

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


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

到目前为止很好。问题:如果我没有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列表是动态的,因此我需要使用动态查询来应用所有||条件。最好的方法是什么?我可以以某种方式循环它还是将数组作为filter方法的标准?

注意:我使用的是Android,因此:


可以使用Java 8 lambda(如您在上面看到的)来简化语法。
无法使用Java 8流(因为min api是Android Lollipop)。这就是为什么使用番石榴来执行过滤的原因。请不要提出基于Java 8流的任何建议。


那么,你有什么主意吗?

最佳答案

您所需要做的就是构建一个番石榴Predicate,因为您需要快速查找,所以首先从该阵列构建Set可能会有所回报:

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


而不是简单地替换谓词:

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

09-13 00:57