Хороший шаблон проектирования для запуска процесса сбора данных?

StackOverflow https://stackoverflow.com/questions/2427048

Вопрос

Я думаю, лучше всего объяснить это с помощью кода. Это простой пример:

public class MyPOJO {

    public String name;
    public int age;

    public MyPOJO(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class MyProcessor {

    public List<MyPOJO> process(List<MyPOJO> mypojos) {
        List<MyPOJO> temp = new ArrayList<MyPOJO>; 
        for (int i=0; i <moypojos.size(); i++) {
            if (filterOne(mypojos[i])) continue;
            if (filterTwo(mypojos[i])) continue;
            if (filterThree(mypojos[i])) continue;
            temp.add(mypojos[i];
        }
    }

    public boolean filterOne(MyPOJO mypojo) {
        // in practice filters aren't so basic
        return (mypojo.age < 21);
    }
    // assume implementations for the other filter methods
}

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

Это было полезно?

Решение

Вы можете иметь список IFilters.

вот так

boolean filtersResult = false;
for (IFilter filter : filters) {
    filterResult = filter.process(mypojos[i])

    if (filterResult)
        break;
}

Другие советы

Возможно, вы захотите реализовать свои фильтры так, чтобы они принимали коллекцию и возвращали отфильтрованную коллекцию:

public interface IFilter<E> {
  public Collection<E> filter(Collection<E> input);
}

Таким образом, вы можете очень просто объединить фильтры.Обратной стороной является то, что для больших коллекций это происходит медленнее и занимает больше места;но код намного читабельнее.

Почему бы не использовать Bean-запрос?это может сделать ваш код читабельным.

List<MyPOJO> result=selectBean(MyPOJO.class).where(
                                                not(
                                                  anyOf(
                                                      value("aga",lessThan(21)),
                                                      value("age",greaterThan(50))
                                                  )
                                                )
                                            .executeFrom(myPojos).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top