【发布时间】:2017-09-19 05:44:51
【问题描述】:
场景是我创建了不同类型的过滤器,它们根据对象的属性过滤某些对象的列表。
为此,我创建了一个 AbstractObjectFilter 类,它被每个过滤器继承。
AbstractObjectFilter.java
public abstract class AbstractEventFilter
{
protected abstract Predicate<IEvent> isEligible();
public List<IEvent> getFilteredEvents(final List<IEvent> events)
{
return events.stream().filter(isEligible()).collect(Collectors.toList());
}
}
所以现在每个过滤器都扩展了这个类并覆盖了 isEligible() 并在该函数中根据其属性返回谓词。
例如:- MinNumOfPrizesFilter.java
public class MinimumNumOfPrizesFilter extends AbstractEventFilter
{
private int minimumNumOfPrizes;
public MinimumNumOfPrizesFilter(@NonNull int minimumNumOfPrizes)
{
this.minimumNumOfPrizes = minimumNumOfPrizes;
}
@Override
protected Predicate<IEvent> isEligible()
{
return event -> event.getPrizeCount() >= minimumNumOfPrizes;
}
}
同样,我还创建了许多其他过滤器。有一个 applyFilter 函数遍历过滤器对象列表并通过调用 getFilteredEvents 函数继续应用过滤器。
现在我如何记录每个事件的命运 例如 - “x1 事件被 MinNumOfPrizesFilter 过滤器过滤。x1 的奖数 - 10,所需的最小奖数 - 20”
【问题讨论】:
-
这里的 lambda 表达式有什么意义?相比于传统的让
AbstractEventFilter直接实现Predicate<IEvent>,子类只需要实现test方法的做法,不是简化。 -
顺便说一句,用
@NonNull注释int变量是没有意义的,因为int的值永远不可能是null。
标签: java logging filter java-8 java-stream