Java Streams:如何应用reduce方法

时间:2018-12-14 10:31:48

标签: java java-stream

我想更改此代码以使其更美观:

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"));
    }
}

我想要得到的是:

  1. 获取数据库的当前范围:this.getApplications(searchForm.getScope())
  2. 为每个app构建一个Criteria
  3. scopeCriteriafilters上填充条件。

我对使用此代码感到非常烦恼,我当时正在考虑使用Optional和其他一些流功能,但是我不太想知道如何获得它。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不是很干净的上下文,但是这个上下文呢?如我所见,List<Criteria> filters仅包含一个元素。

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);
}