Предусматривает ли какая-либо общая библиотека Java метода для найти элемент в конечной коллекцииигарантировать, что именно один матч?метод библиотеки Java, чтобы найти элемент в коллекции и проверить, есть ли в точности один матч
Метод мог бы, например, вернуть null
, если ничего не было найдено и выбрано исключение, если было найдено несколько элементов.
В настоящее время я использую свою собственную реализацию (см. Ниже), но я бы не стал загрязнять бизнес-код такими полезными методами (даже если они были извлечены в отдельный пакет утилиты).
Я также не хочу, чтобы накладные расходы на повторное использование более одного раза или накладные расходы на сборку фильтров и просмотр длины результата.
P.S. мое текущее решение (которое работает, но должен быть заменен методом библиотеки):
public static <T> T getSingleMatch(Iterable<T> lookIn, com.google.common.base.Predicate<? super T> predicate) {
T foundItem = null;
for (T item : lookIn) {
if (predicate.apply(item)) {
if (foundItem != null)
throw new RuntimeException("multiple matches"); // alternatively: `return null;`
else
foundItem = item;
}
}
// alternatively: `if (foundItem == null) throw ...`
return foundItem;
}
Почему вы это требование? Без дополнительной информации, похоже, что вам лучше использовать «Set» в первую очередь. Поведение изменилось бы на исключение при вставке (конечно, вам нужно проверить возвращаемое значение 'add'). Или вы можете использовать MultiSet. Или это требование работать на всех видах Итераций? – Axel
@Axel: Спасибо за ваше предложение. Я получаю «Итерируемый» из внешнего интерфейса; он может содержать несколько элементов, которые соответствуют некоторым критериям (сложные - не просто '.equals()'), а бизнес-логике (==> 'RuntimeException') не допускается. Библиотека 3rdparty фактически возвращает 'ArrayList' * в своей текущей реализации *, но я не хочу полагаться на это. Количество элементов может быть очень большим, и все, что мне нужно, это извлечь один элемент - вот почему я не хочу накладных расходов на создание 'Set' именно для этой цели. –