我有一个将被过滤的对象列表。
此过滤将包含至少3个规则。
例如:
public class Filtering {
List<MyObject> myObjectList;
List<MyObject> filterStep1(List<MyObject> myObjectList){
for(Myobject myobj : myObjectList){
if(isCriteriaSatisified){
continue
}
else {
removeThisObjectFromList
}
}
}
List<MyObject> filterStep2(List<MyObject> myObjectList){
for(Myobject myobj : myObjectList){
if(isCriteriaSatisified){
continue
}
else {
removeThisObjectFromList
}
}
}
}
我喜欢这种方法,因为它简单,自包含,可以很容易地看到想要实现的目标。
但也许我应该使用一种设计模式呢?
责任链&#34;模式是我考虑filterStep1&amp; amp;上面代码中的filterStep2将被重构为一个单独的错误。
答案 0 :(得分:4)
这是&#34;管道和过滤器&#34;模式,虽然您的实现没问题,但最好不要在方法中对过滤逻辑进行硬编码。相反,为每个布尔条件(Java 8中内置的条件或Guava中的条件)写一个Predicate<MyObject>
。这更容易测试,并且可以轻松应用于现有的干净API,例如Streams API或Guava的集合视图。
答案 1 :(得分:2)
使用Java 8流的一个选项:
myObjects.stream().filter( this::isCriteriaSatisified ).filter( this::anotherCriteria )
假设您的班级中有boolean isCriteriaSatisified(myObj)
方法。然后,您可以将该流收集到另一个列表中。