标题翻译
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
的所有过滤器。
我如何将 status
和 requestParameter
传递给 test()
?我还遇到了一个错误 非静态方法无法从静态上下文引用
?
是否有比我尝试的以下方法更好的方法:
- 将
allFilters
初始化为字段:
private BiPredicate<Status, Request> allFilters =
filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true);
- 然后调用:
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<I, C> extends BiPredicate<I, C> {}
I inject in all these filter as a list in my Service class:
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
}
}
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:
-
Initialise
allFilters
as field:private BiPredicate<Status, Request> allFilters = filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true);
-
Then invoke call:
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);
}
答案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<Status> summaries ==this.repo
.summary(requestParameter)
.stream()
.filter(r -> filters.stream()
.allMatch(f -> 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<Status> getStatus = this.repo
.summary(request)
.stream()
.filter(status-> this.filters.stream().reduce(BiPredicate::and).orElse((x, y) -> true).test(status, request))
.collect(toList());
专注分享java语言的经验与见解,让所有开发者获益!
评论