在非静态上下文中组合双谓词

huangapple 未分类评论63阅读模式
标题翻译

Composing Bi-Predicate in non-static context

问题

我已为您翻译好了您提供的内容:

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

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

我在我的 Service 类中将所有这些过滤器作为列表进行注入:

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=来自流的状态,arg2=requestParameter
    }
}

我正在努力完成上述操作并应用来自集合 filters 的所有过滤器。
我如何将 statusrequestParameter 传递给 test()?我还遇到了一个错误 非静态方法无法从静态上下文引用

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

  1. allFilters 初始化为字段:
private BiPredicate<Status, Request> allFilters = 
    filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true);
  1. 然后调用:
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);
}
英文翻译

I have interface defined for all Filters:

public interface Filter&lt;I, C&gt; extends BiPredicate&lt;I, C&gt; {}

I inject in all these filter as a list in my Service class:

public class SomeClass {
	private List&lt;BiPredicate&lt;Status, Request&gt;&gt; filters;

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

I am struggling to complete the above and apply all the filters from the collections filters.
How do I pass status and requestParameter to test()? I am also getting an error non-static method cannot be referenced from static context?

Is there a better way than the following which is what I attempted:

  1. Initialise allFilters as field:

     private BiPredicate&lt;Status, Request&gt; allFilters = 
         filters.stream().reduce(BiPredicate::and).orElse((x, y) -&gt; true);
    
  2. Then invoke call:

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

applyFilters():

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

答案1

得分: 0

你可能想尝试使用 allMatch,如下所示:

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

You might want to try allMatch as

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

答案2

得分: 0

基于此帖子的回答

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());
英文翻译

Based on answer from this post

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

huangapple
  • 本文由 发表于 2020年1月30日 18:34:59
  • 转载请务必保留本文链接:https://java.coder-hub.com/59984018.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定