CompletionStage, CompletableFuture Void — что возвращать?

Вот мой метод:

public CompletionStage<Void> insert(List<HashAction> hashActionList) {
    if(!hashActionList.isEmpty()) {
        return ...
    }
    // what to return here ?
}

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

Я попытался

return CompletableFuture.completedFuture(null);

Но я не совсем уверен, так как случайно выбрал одну реализацию CompletionStage.


person Max    schedule 26.11.2019    source источник
comment
Выбросить исключение? Имеет ли смысл вызывать его с пустым списком? Какова ваша нормальная возвращаемая стоимость? Почему это метод асинхронный вообще?   -  person luk2302    schedule 26.11.2019
comment
Наличие пустого списка является правильным вариантом использования, поэтому я не могу создать исключение. Этот метод является асинхронным, поскольку он вставляет данные в коллекцию монго. Мое обычное возвращаемое значение недействительно   -  person Max    schedule 26.11.2019
comment
CompletableFuture является фактической реализацией CompletionStage. Настолько, что интерфейс CompletionStage имеет метод, единственная цель которого — превратить его в CompletableFuture: #toCompletableFuture(). Кроме того, это единственная общедоступная реализация, предоставляемая Java SE. Я хочу сказать, что возвращение CompletableFuture не вызывает подозрений. Кроме того, поскольку ваш метод возвращает CompletionStage, не имеет значения, какая реализация на самом деле возвращается.   -  person Slaw    schedule 26.11.2019
comment
Что именно произойдет, если вы просто удалите !hashActionList.isEmpty() и выполните все, что находится в этом блоке, независимо от того, пуст список или нет? Будет ли это уже правильно? Если вы просто пытаетесь оптимизировать случай пустого списка, верните эквивалент того, что вы возвращаете в неоптимизированном случае. См. также Как правильно создать уже завершенный CompletableFuture<Void>   -  person Holger    schedule 29.11.2019
comment
что вы собираетесь вернуть, если hashActionList не пусто?   -  person Alexei Kaigorodov    schedule 02.12.2019
comment
Я использую MongoDB, а insertMany не принимает пустой список   -  person Max    schedule 03.12.2019


Ответы (1)


Вы можете просто вернуть CompletableFuture<Void>, просто имея пустой метод асинхронного запуска

public CompletionStage<Void> insert(List<String> hashActionList) {
    if(!hashActionList.isEmpty()) {
        return null;
    }
    return CompletableFuture.runAsync(()->{});
}

ИЛИ вы можете использовать thenAccept, чтобы вернуть CompletionStage<Void> и избежать null

return CompletableFuture.completedFuture(null).thenAccept(i->{});
person Deadpool    schedule 26.11.2019
comment
Возврат null, когда тип возвращаемого значения CompletionStage, кажется нелогичным. Лично я рассматриваю это так же, как возврат null, когда тип возврата Optional. - person Slaw; 26.11.2019
comment
Какой смысл звонить runAsync(()->{}) или thenAccept(i->{})? Это просто пустая трата ресурсов, чтобы в конечном итоге получить что-то, что не отличается от completedFuture(null). - person Holger; 29.11.2019