Мне нужно извлечь несколько уникальных элементов из коллекции с учетом определенных критериев. Например. если у меня есть коллекция с [(a1, t1, v1), (a2, t2, v2), ..., (an, tx, vy)]
Я хотел бы получить a1, t5, v8.
В Гуаве я могу иметь Предикат для каждого (например, IsA1 реализует Предикат ...), а затем использовать Iterables.find (collection, Предикат), чтобы найти каждый элемент. Это нормально, но потенциально может проходить через всю коллекцию для каждого предиката.
Я мог бы объединить предикаты в один, используя Predicates.or (...) и использовать Iterables.filter, но тогда мне придется искать итоговую итерацию для каждого отдельного элемента, который мне нужен.
То, что я хотел бы иметь - это вызов функции -let "locate", которая бы взяла коллекцию элементов, список предикатов и создала карту (предикат -> элемент)
<T> Map<Predicate<? super T>, T> locate(Collection<T>, Collection<Predicate<? super T>)
Я свернул свой, потому что не смог его найти, но это настолько распространенный случай, что, я думаю, я его еще не нашел.
Моя версия для справки:
public static <T> Map<Predicate<? super T>,T> locateUnique(Iterable<T> col, Collection<Predicate<? super T>> predicates) {
HashMap<Predicate<? super T>, T> result = Maps.newHashMap();
for (T t:col) {
for (Predicate<? super T> p:predicates) {
if (p.apply(t)){
result.put(p, t);
}
}
}
return result;
}
Есть ли готовый способ сделать это? Я предполагаю, что для полноты должно быть 2 версии:
locateUnique(...) -> Map<Predicate,T>
locate(...) -> MultiMap<Predicat,T>