потоки Java: собирать с учетом потока пуст - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы построить Sort объект, используя этот Optional -подобный код:

private Sort buildSort(Collection<String> fields) {
    fields.stream()
        .map(this::buildOrder)
        .collect(Sort.unsorted(), ????, ????);
}

buildOrder:

private Order buildOrder(String field) {
    if (field.startsWith("-")) {
        return Order.desc(field.substring(1));
    }
    else {
        return Order.asc(field);
    }
}

Мне нужно вернутьSort.unsorted(), если поток пустой, или объединить каждый Sort объект.

У объекта сортировки есть метод and, который обозначает построение и объединение заказов.

Sort.by(sort1)
    .and(sort2)...

Так что янужно что:

if (stream is empty) then
  return Sort.unsorted
else
  return foreach item in stream:
     Sort.by(item).and(item2).and(item3)...

Классы:

org.springframework.data.domain.Sort
org.springframework.data.domain.Sort.Order

NOTE

Мне нужно использовать stream-api!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я считаю, что это должно работать.Вторая map конвертирует каждую Order в свою Sort.Аккумулятор и сумматор просто сложите вместе Sorts.

return fields.stream()
    .map(this::buildOrder)
    .map(Sort::by)
    .collect(Sort::unsorted, Sort::and, Sort::and);
0 голосов
/ 18 февраля 2019

Поскольку вам нужно использовать Stream s, вы можете просто использовать это:

public Sort buildSort(Collection<String> fields) {
    return fields.stream()
        .map(this::buildOrder)
        .map(Sort::by)
        .reduce(Sort.unsorted(), Sort::and);
}

Старый ответ

Поскольку метод buildOrder() не возвращаетпусто Sort.Order вы можете просто сначала проверить, является ли fields пустым, а затем напрямую вернуть Sort.unsorted().

А для объединения сортов вы можете даже не захотеть использовать Stream, анормальный цикл:

public Sort buildSort(Collection<String> fields) {
    if(fields.isEmpty()) {
        return Sort.unsorted();
    }

    Sort result = null;
    for(String field : fields) {
        Sort.Order order = buildOrder(field);
        if(result == null) {
           // initially create a Sort
           result = Sort.by(order);
        } else {
            // then just concatenate them
            result = result.and(order);
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...