java - 使用 java 流按谓词过滤时记录过滤器的结果

标签 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());
    }
}

因此,现在每个过滤器都扩展此类并重写 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 表达式中添加括号,并在验证之前添加日志记录语句:

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

关于java - 使用 java 流按谓词过滤时记录过滤器的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43555977/

相关文章:

java - 为什么每次执行uploadArchives都会生成很多pom文件?

logging - Spring Boot : How to disable startup log message "Starting Application on mbp with PID 99446"

android - : java. lang.NoSuchMethodError : okhttp3. internal.Platform.log 导致 Retrofit2 登录出错

javascript - 如何以 Angular 访问过滤数组的属性

function - Haskell 映射和过滤器

java - 控制台条形图使用循环,不带图形JAVA

java - Java 中的 ".class"关键字

java - 使用类加载器隔离两个静态类

batch-file - 使用 .bat 附加文本