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

rci*_*222 6 java logging filter java-8 java-stream

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

所以为此我创建了一个每个过滤器继承的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());
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在每个过滤器都扩展了这个类并覆盖了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

现在我如何记录每个事件的命运例如 - "x1事件由MinNumOfPrizesFilter过滤器过滤.x1的奖励数量 - 10,所需的最低奖励数量 - 20"

Jea*_*ard 8

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

return event -> {
    // LOG.info(event.getName() + " was filtered...") or whatever you use for logging.
    return event.getPrizeCount() >= minimumNumOfPrizes;
}
Run Code Online (Sandbox Code Playgroud)

请注意,存在一个peek主要用于登录java流的操作:

events.stream()
      .peek(event -> System.out.println("Filtering event" + event.getName()))
      .filter(isEligible())
      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这并没有帮助,因为您需要登录AbstractEventFilter 实现.

  • @PJMeisch我知道.窥视操作不适合这里,只是在信息上添加它,因为它对使用java-streams进行日志记录有很多帮助. (3认同)
  • 使用此功能,您将记录已过滤的值和未过滤的值 (2认同)