过滤对象的设计模式

5
我有一个对象列表将被筛选。
这个筛选至少包括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
        }
    }
}

}

我喜欢这种方法,因为它简单、自包含且很容易看出想要实现什么。
但也许我应该使用一种设计模式?
“责任链”模式是我正在考虑的一种模式,在上面的代码中,filterStep1和filterStep2会被重构成一个独立的处理程序。

1
你可以考虑使用Java8的Stream API,它为集合对象提供了出色的过滤选项。 - Konstantin Yovkov
1
这个问题更适合在代码审查上提问,而不是在Stack Overflow上。 - ZeroOne
1
只有一个备注:您正在修改原始列表。我所谓的过滤是生成一个新列表,仅包含有效元素,而不修改原始列表。 - Serge Ballesta
2个回答

5
这是“管道和过滤器”模式,虽然你的实现还可以,但最好不要在方法中硬编码筛选逻辑。相反,为每个布尔条件编写一个Predicate<MyObject>(可以使用Java 8内置的或Guava提供的)。这样更容易测试,并且可以轻松应用于现有的干净API,例如Streams API或Guava的集合视图。

我同意使用函数进行过滤会更加清晰,但是我不能使用Java8 API。所以我将会采用我在问题中提出的建议选项。谢谢。 - blue-sky
@blue-sky,考虑使用Guava来实现该模式。 - chrylis -cautiouslyoptimistic-

2

使用Java 8流的一种选项:

myObjects.stream().filter( this::isCriteriaSatisified ).filter( this::anotherCriteria )

假设您的类中有一个方法boolean isCriteriaSatisified(myObj),您可以将该流收集到另一个列表中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接