使用java stream过滤谓词时记录filter的结果

场景是我创建了不同类型的filter,它们根据对象的属性过滤一些对象的列表。

因此,我创建了一个由每个filterinheritance的AbstractObjectFilter类。
AbstractObjectFilter.java

public abstract class AbstractEventFilter { protected abstract Predicate isEligible(); public List getFilteredEvents(final List events) { return events.stream().filter(isEligible()).collect(Collectors.toList()); } } 

所以现在每个filter都扩展了这个类并覆盖了isEligible(),并且在该函数中它根据其属性返回谓词。

例如: – MinNumOfPrizesFilter.java

 public class MinimumNumOfPrizesFilter extends AbstractEventFilter { private int minimumNumOfPrizes; public MinimumNumOfPrizesFilter(@NonNull int minimumNumOfPrizes) { this.minimumNumOfPrizes = minimumNumOfPrizes; } @Override protected Predicate isEligible() { return event -> event.getPrizeCount() >= minimumNumOfPrizes; } } 

同样,我创建了许多其他filter。 有一个applyFilter函数迭代filter对象列表,并通过调用getFilteredEvents函数继续应用filter。

现在我如何记录每个事件的命运例如 – “x1事件由MinNumOfPrizesFilterfilter过滤.x1的奖励数量 – 10,所需的最低奖励数量 – 20”

您可以简单地在lambda表达式中添加括号,并在validation之前添加日志记录语句:

 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实现。

也许不是最漂亮的解决方案,但它可以工作,你只需要改变你的抽象基类:

 abstract class AbstractEventFilter { private final Logger logger = Logger.getLogger(getClass().getCanonicalName()); private final String filterName = getClass().getSimpleName(); protected abstract Predicate isEligible(); private Predicate internalIsEligible() { return iEvent -> { boolean res = isEligible().test(iEvent); if (!res) { logger.info("event " + iEvent.toString() + " filtered by " + filterName); } return res; }; } public List getFilteredEvents(final List events) { return events.stream().filter(internalIsEligible()).collect(Collectors.toList()); } } 

保持派生类像以前一样实现isELigible() ,只有在getFilteredEvents方法中,才调用internalIsEligibable方法。