java流:如何应用reduce方法
我想更改此代码以使其更加优雅:java流:如何应用reduce方法,java,java-stream,Java,Java Stream,我想更改此代码以使其更加优雅: List<Criteria> filters = new ArrayList<Criteria>(); if (null != searchForm.getScope()) { List<Criteria> scopeCriteria = this.getApplications(searchForm.getScope()) .stream() .map(app -> Criter
List<Criteria> filters = new ArrayList<Criteria>();
if (null != searchForm.getScope()) {
List<Criteria> scopeCriteria = this.getApplications(searchForm.getScope())
.stream()
.map(app -> Criteria.where("appCreation").is(app.getCode()))
.collect(Collectors.toList());
<<<< HOW TO APPLY A REDUCE METHOD ON scopeCriteria >>>
if (!scopeCriteria.isEmpty()) {
if (scopeCriteria.size() == 1) {
filters.add(scopeCriteria.get(0));
}
else {
Criteria crit = new Criteria();
filters.add(crit.orOperator(scopeCriteria.toArray(new Criteria[scopeCriteria.size()])));
}
}
else {
filters.add(Criteria.where("appCreation").is("unknown"));
}
}
List filters=new ArrayList();
if(null!=searchForm.getScope()){
List scopeCriteria=this.getApplications(searchForm.getScope())
.stream()
.map(app->Criteria.where(“appCreation”).is(app.getCode())
.collect(Collectors.toList());
如果(!scopeCriteria.isEmpty()){
if(scopeCriteria.size()==1){
filters.add(scopeCriteria.get(0));
}
否则{
Criteria crit=新标准();
添加(crit.orOperator(scopeCriteria.toArray)(新条件[scopeCriteria.size()));
}
}
否则{
filters.add(Criteria.where(“appCreation”)。为(“未知”);
}
}
我想得到的是:
this.getApplications(searchForm.getScope())
应用程序
建立一个标准
scopeCriteria
上的标准填充到过滤器
可选的
和其他一些流特性,但我不太明白如何得到它
有什么想法吗?背景不太清楚,但这一个呢?正如我所看到的,
列表过滤器
只包含一个元素
public static Criteria getFiltersByCriteria(Scope scope, Criteria criteria) {
if (scope == null)
return null;
Criteria[] scopeCriteria = getApplications(scope).stream()
.map(app -> criteria.is(app.getCode()))
.toArray(Criteria[]::new);
if (scopeCriteria.length == 0)
return Criteria.where("appCreation").is("unknown");
if (scopeCriteria.length == 1)
return scopeCriteria[0];
return new Criteria().orOperator(scopeCriteria);
}
在我看来,您的流代码已经非常精简了(没有双关语)。在我的脑海中,也许你可以在添加过滤器时将
if
和else
条件结合起来,即使只有一个过滤器,也可以只使用else
代码。这个问题不是更适合代码审查吗?使用1标准的或操作器有什么问题吗?这也会简化它。例如,我正在考虑对scopeCriteria应用reduce方法……也许:Criteria[]scopeCriteria=this.getApplications(searchForm.getScope()).stream().map(app->Criteria.where(“appCreation”).is(app.getCode()).toArray(Criteria[]::new);if(scopeCriteria.length==1){filters.add(scopeCriteria[0]);}else if(scopeCriteria.length>1){filters.add(new Criteria().orOperator(scopeCriteria));}
但我同意@TimBiegeleisenWell,这是带有list的版本中的旧部分。如果是list
,我仍然使用get(0)
而不是iterator()…