it-swarm.com.ru

CollectionUtils в Java с использованием предиката

У меня есть List<Object>, и я хочу вернуть первое значение, которое оно находит true, которое соответствует предикату. 

Я обнаружил, что могу использовать CollectionUtils.find(collection,predicate) (Apache commons). Предполагая, что Object содержит целочисленную переменную с именем: value, как мне указать в предикате, что значение может быть 1,2,3,4,5, и отбросить те, которые не совпадают. Можно ли сделать «содержит».

Также не используется Java 8, поэтому не в состоянии сделать поток. 

11
Rory Lester

Чтобы вернуть первый элемент в списке, который соответствует данному предикату:

MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() {
    @Override
    public boolean evaluate(MyObject o) {
        return o.getValue() >= 1 && o.getValue() <= 5;
    }
});

Чтобы отфильтровать список так, чтобы он содержал только элементы, соответствующие предикату:

CollectionUtils.filter(myList, new Predicate<MyObject>() {
    @Override
    public boolean evaluate(MyObject o) {
        return o.getValue() >= 1 && o.getValue() <= 5;
    }
});

Вы можете заметить, что Predicate<MyObject> такой же.

25
Jean Logeart

В Java 8 вы можете написать

Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny();

До Java 7 самое простое решение - использовать цикл.

Integer found = null;
for(integer i : list)
   if (i >= 1 && i <= 5) {
        found = i;
        break;
   }

Это был бы самый чистый и быстрый способ, поскольку Java 7 не поддерживает лямбды.

5
Peter Lawrey

Вы можете использовать Collections.removeIf (я предполагаю, что вы используете JDK 8). Вы также можете использовать поток:

list = list.stream().filter(predicate).collect(Collectors.toList());

Используя Apach Commons Collections, вы можете использовать CollectionUtils.filter .

0
Dici