【问题标题】:Composing Bi-Predicate in non-static context在非静态上下文中组合双谓词
【发布时间】:2020-01-30 10:34:59
【问题描述】:

我为所有过滤器定义了接口:

public interface Filter<I, C> extends BiPredicate<I, C> {}

我将所有这些过滤器作为一个列表注入到我的服务类中:

public class SomeClass {
    private List<BiPredicate<Status, Request>> filters;

    public List<Status> getStatus(final Request requestParameter) {
      final List<Status> summaries == this.repo
              .summary(requestParameter)
              .stream()
              .reduce(BiPredicate::and).orElse((x, y) -> true)
              .test();  //arg1=status from stream, arg2=requestParameter
  }
}

我正在努力完成上述操作并应用集合 filters 中的所有过滤器。 如何将statusrequestParameter 传递给test()?我也收到错误non-static method cannot be referenced from static context

有没有比我尝试的以下更好的方法:

  1. allFilters 初始化为字段:

    private BiPredicate<Status, Request> allFilters = 
        filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true);
    
  2. 然后调用调用:

    this.repo.statusSummary(request)
        .stream()
        .filter(status -> applyFilters(status, request))
        .collect(toList());`
    

applyFilters():

private boolean applyFilters(Status status, Request request) {
    return this.allFilters.test(status, request);
}

【问题讨论】:

  • 您所说的“更好”是指一种在一个声明中做到这一点的方法吗?
  • 更好的意思是避免将allFilters初始化为类变量,而是结合方法中的函数并测试并返回结果。
  • 在我看来,你实现的比你想要的要好。

标签: java java-8 java-stream predicate


【解决方案1】:

你可能想试试allMatch as

final List<Status> summaries ==this.repo
        .summary(requestParameter)
        .stream()
        .filter(r -> filters.stream()
                .allMatch(f -> f.test(s, requestParameter)))
        .collect(Collectors.toList();

【讨论】:

  • allMatch()的调用与我的回答完全一样吗?它将应用并检查所有定义的过滤器?
  • @M06H 是的,它会 test 用于列表中的所有现有过滤器。
【解决方案2】:

基于answer from this post

final List<Status> getStatus = this.repo
                .summary(request)
                .stream()
                .filter(status-> this.filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true).test(status, request))
                .collect(toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多