场景是我创建了不同类型的过滤器,它们根据对象的属性过滤一些对象的列表。
为此,我创建了一个由每个过滤器继承的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”
答案 0 :(得分:7)
您可以简单地在lambda表达式中添加括号,并在验证之前添加日志记录语句:
return event -> {
// LOG.info(event.getName() + " was filtered...") or whatever you use for logging.
return event.getPrizeCount() >= minimumNumOfPrizes;
}
请注意,存在peek
操作,主要用于登录java流:
events.stream()
.peek(event -> System.out.println("Filtering event" + event.getName()))
.filter(isEligible())
.collect(Collectors.toList());
但这并没有帮助,因为您需要登录AbstractEventFilter
实施。
答案 1 :(得分:2)
也许不是最漂亮的解决方案,但它可以工作,你只需要改变你的抽象基类:
isELigible()
您保持派生类像以前一样实现getFilteredEvents
,只有在internalIsEligibable
方法中,您才会调用set_data()
方法。