Хороший шаблон проектирования для запуска процесса сбора данных? - PullRequest
2 голосов
/ 11 марта 2010

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

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
}

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

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

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

вроде так

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

    if (filterResult)
        break;
}
0 голосов
/ 24 ноября 2014

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

List<MyPOJO> result=selectBean(MyPOJO.class).where(
                                                not(
                                                  anyOf(
                                                      value("aga",lessThan(21)),
                                                      value("age",greaterThan(50))
                                                  )
                                                )
                                            .executeFrom(myPojos).
0 голосов
/ 11 марта 2010

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

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

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

...