Java-потоки: как применить метод Reduce - PullRequest
0 голосов
/ 14 декабря 2018

Я хотел бы изменить этот код, чтобы сделать его более элегантным:

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. Заполнить критерии от scopeCriteria до filters.

Я чувствуюочень шумно с этим кодом, я думал об использовании Optional и некоторых других потоковых функций, но я не совсем понимаю, как его получить.

Есть идеи?

1 Ответ

0 голосов
/ 14 декабря 2018

Не совсем чистый контекст, но как насчет этого?Как я вижу, 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...