Frage

Am besten mit Code erklärte ich denke, das ist nur ein einfaches Beispiel:

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
}

Huch, das ist hässlich. Im Prinzip habe ich eine Sammlung, und ich mag es durch ein Sieb mit einer Art nur passieren, weiterhin die Objekte verarbeitet werden, die ein bestimmten Kriterien erfüllen. Meine Vermutung ist, gibt es ein besseres Muster für diese als ein Bündel von Methoden, die Boolesche Werten zurück.

War es hilfreich?

Lösung

Sie können die Liste von IFilters haben.

wie so

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

    if (filterResult)
        break;
}

Andere Tipps

Sie möchten Ihre Filter implementieren, so dass sie eine Sammlung nehmen, und gibt eine gefilterte Auflistung:

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

Auf diese Weise können Sie Kette zusammen filtert sehr trivialer. Der Nachteil ist, dass für große Sammlungen es langsamer ist und mehr Platz in Anspruch nimmt; aber der Code ist viel besser lesbar.

Warum nicht Bean-Abfrage ? es kann Ihr Code lesbar machen.

List<MyPOJO> result=selectBean(MyPOJO.class).where(
                                                not(
                                                  anyOf(
                                                      value("aga",lessThan(21)),
                                                      value("age",greaterThan(50))
                                                  )
                                                )
                                            .executeFrom(myPojos).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top