Как функционально обработать этот запрос? - PullRequest
0 голосов
/ 29 мая 2020

// Как мы можем обработать приведенный ниже код функциональным образом, например собрать все недопустимые параметры сортировки, подготовить сообщение со всеми перечисленными и, наконец, выбросить исключение InvalidSortParam.

Как вы думаете, это делает запрос ниже?

publi c Sort resolveArgument () {

    Sort sort = sortHandlerMethodArgumentResolver.resolveArgument();

    List<Sort.Order> orders = sort.stream().collect(Collectors.toList());
    List<String> invalidSortList = orders.stream().map(Sort.Order::getProperty)
            .filter(property -> !allowedSortParams.contains(property))
            .collect(Collectors.toList());

    if (orders.isEmpty()) {
        sort = Sort.by(Sort.Direction.DESC, defaultSortParam);
    } else {
        if (orders.size() > sortMaxCount) {
            throw new InvalidSortException(INVALID_SIZE_PARAMS);
        } else {
            if (!invalidSortList.isEmpty()) {
                throw new InvalidSortException(invalidSortList.stream()
                        .collect(Collectors.joining(",")) + INVALID_SORT_PARAMS);
            }
        }
    }

    return sort;
}

1 Ответ

1 голос
/ 29 мая 2020

Прежде всего - вы не пользуетесь функцией потоковой передачи, вы разделили ее на два отдельных шага - загрузка данных, и когда она будет завершена - их преобразование. Вы можете объединить его в один конвейер. Во-вторых, выброс исключений не является функциональным способом. Вы должны использовать какой-то тип для возврата состояния, например, с некоторой реализацией Try.

final class Try<T> {

    private final Exception e;
    private final T t;

    public Try(Exception e) {
        this.e = e;
        t = null;
    }

    public Try(T t) {
        this.t = t;
        e = null;
    }

    public Exception getE() {
        return e;
    }

    public T getT() {
        return t;
    }
}

, а сам код может выглядеть примерно так:

public Try<Sort> resolveArgument()  {
    int cnt = getCount();
    return cnt == 0 ? Sort.by(Sort.Direction.DESC, defaultSortParam) : someErrorHandlingLogic(cnt);

}

private static void getCount() {
    sort.stream().map(Sort.Order::getProperty)
            .filter(property -> !allowedSortParams.contains(property))
            .count();
}

Если вас интересует функциональное программирование парадигма в java - рекомендую отличную презентацию https://dev.tube/video/YnzisJh-ZNI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...