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()…