Guava Collections - фильтр по массиву значений String - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть список участников событий. Каждый объект выставляет getId() геттер. Мне нужно отфильтровать коллекцию, чтобы получить только элементы с определенным идентификатором, я могу сделать это следующим образом:

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 (как вы можете видеть выше).
  • Нельзя использовать потоки Java 8 (поскольку min api - это Android Lollipop). Вот почему Гуава используется для фильтрации. Пожалуйста, не предлагайте какие-либо предложения, основанные на потоках Java 8.

Итак, у вас есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Используя только 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());
0 голосов
/ 05 сентября 2018

Все, что вам нужно сделать, это построить гуаву Predicate, так как вам понадобится быстрый поиск, может быть полезно сначала построить Set из этого массива:

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

А чем просто заменить Предикат:

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