Элегантный способ выбросить исключение в пустой поток - PullRequest
1 голос
/ 31 марта 2020

Я получаю список клиентов. Затем я сопоставляю enitity с dto и возвращаю результат. Я хотел бы выбросить исключение в пустой список клиентов, но также хочу избежать оператора if в коде.

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

Set<ClientDto> clients = Optional.of(repo.findByNumber(number))
                .filter(CollectionUtils::isNotEmpty)
                .orElseThrow(() -> new NotFoundException())
                .stream()
                .map(client -> new ClientDto(client.getName()))
                .collect(Collectors.toSet());

Есть ли более чистое решение? Потому что в моем коде мало бесполезных цепочек. Я даже сейчас начинаю думать, что чисто, если бы было более читабельным.

1 Ответ

2 голосов
/ 31 марта 2020

Я не знаю, как вы можете сделать это с чистыми потоками, но вы можете определить метод, который возвращает поток из списка и выдает исключение, если он пустой.

private <T> Stream<T> throwIfEmpty(List<T> list) {
    if(list.isEmpty()) {
        throw new IllegalArgumentException("List must not be empty");
    }
    return list.stream();
}

, тогда вы можете использовать это следующим образом:

List<Client> clients = throwIfEmpty(repo.findByNumber(number))
    .map(client -> new ClientDto(client.getName()))
    .collect(Collectors.toSet());

возможно, это решение вас порадует:)

...