Apache использует PredicatedList без исключения IllegalArgumentException

Есть ли способ в коллекциях Apache Commons иметь PredicatedList (или аналогичный) который не генерирует исключение IllegalArgumentException, если вещь, которую вы пытаетесь добавить, не соответствует предикату? Если он не совпадает, он просто проигнорирует запрос на добавление элемента в список.

Так, например, если я сделаю это:

List predicatedList = ListUtils.predicatedList(new ArrayList(), PredicateUtils.notNullPredicate());
...
predicatedList.add(null); // throws an IllegalArgumentException 

Я хотел бы иметь возможность сделать вышеперечисленное, но с добавлением нулевого значения, которое игнорируется без исключения.

Я не могу понять из JavaDocs, поддерживает ли это коллекция Commons. Я хотел бы сделать это, если это возможно, без моего собственного кода.


person A_M    schedule 06.05.2009    source источник
comment
Разве смысл предикатного списка не в том, что вам нужны только те вещи в списке, которые соответствуют определенным для него условиям? Почему бы просто не использовать обычный список?   -  person Edward Q. Bridges    schedule 06.05.2009
comment
Да, это точка предикативного списка. Но я хочу, чтобы он тихо игнорировал вещи, которые не соответствуют предикату, то есть выполняли проверку предиката, но не жаловались, если он не соответствует.   -  person A_M    schedule 06.05.2009
comment
Логически это такое же поведение, как и в обычном списке, поскольку вас не волнует проверка предиката, информирующая вас о том, что элемент не прошел проверку.   -  person Edward Q. Bridges    schedule 06.05.2009
comment
Нет, это не то же самое. Вы можете добавлять null в стандартный ArrayList столько раз, сколько хотите. Они входят как отдельные элементы. Так что сделайте l.add(null); л. добавить (ноль); л.размер();. l.size() вернет 2. Я не хочу, чтобы в список добавлялись нули, поэтому я хочу использовать что-то вроде PredicatedList.   -  person A_M    schedule 06.05.2009
comment
используйте обычный список и выполняйте нулевую проверку перед добавлением. Не имеет смысла иметь предикатный список с предикатом NonNull, который содержит значения Null. С другой точки зрения: представьте себе таблицу базы данных с ненулевым ограничением для столбца, содержащего нулевые значения: какой смысл ограничивать его?   -  person Edward Q. Bridges    schedule 06.05.2009
comment
Вы полностью упускаете из виду то, что я пытаюсь донести. Мне не нужны нули в списке, поэтому я посмотрел на PredicatedList. Я не хочу делать нулевую проверку во всех местах, где используется список. Я хотел бы передать ссылку на разные вещи, которые могут быть добавлены в список. Если в этих местах попытаются добавить null, я хочу проигнорировать это добавление. Но я не хочу заставлять везде ловить исключение IllegalArgumentException, которое я получил бы, если бы использовал PredicatedList. Так что хотелось бы функционала PredicatedList, но без выбрасывания исключений, без необходимости накатывать свой!   -  person A_M    schedule 06.05.2009


Ответы (2)


Разве вы не можете просто проглотить исключение?

try
{
    predicatedList.add(null);
}
catch(IllegalArgumentException e)
{ 
    //ignore the exception
}

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

person masher    schedule 06.05.2009
comment
Спасибо. Я хотел бы сделать это только с кодом библиотеки. Но я прихожу к тому же выводу, что мне придется написать свою собственную оболочку, чтобы проглотить исключение. - person A_M; 06.05.2009

Только что нашел CollectionUtils.filter. Я, вероятно, могу переработать свой код, чтобы использовать это, хотя было бы неплохо, во-первых, незаметно предотвратить добавления в список.

    List l = new ArrayList();
    l.add("A");
    l.add(null);
    l.add("B");
    l.add(null);
    l.add("C");

    System.out.println(l); // Outputs [A, null, B, null, C]

    CollectionUtils.filter(l, PredicateUtils.notNullPredicate());

    System.out.println(l); // Outputs [A, B, C]
person A_M    schedule 06.05.2009