繁体   English   中英

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

[英]Guava Collections - filter by array of String values

我有一个事件对象列表。 每个对象都公开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流的建议。

那么,你有什么主意吗?

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

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

而不是简单地替换谓词:

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

仅使用Java 8,您将执行以下操作:

final Set<String> categories = new HashSet<>(Arrays.asList("category 1", "category 2"));
ret.stream()
   .filter(x -> categories.contains(x.getCategoryId()))
   .collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM