Completable <Object>возвращается, в то время как Completable <Void>требуется - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть следующий класс Person:

class Person {
    String name;
    String city;
    public void setInfo(PersonInformation info) {//...};
}

У меня есть список объектов из этого класса, и я хочу заполнить их информацию асинхронно, запрашивая БД для каждого элемента в списке, используя методкоторое возвращает CompletableFuture:

List<CompletableFuture<Void>> populateInformation(List<Person> people) {
     return people.stream().
            .collect(groupingBy(p -> p.getLocation(), toList()))
            .entrySet().stream()
            .map(entry -> 
                    CompletableFuture.supplyAsync(
                            () -> db.getPeopleInformation(entry.getKey())
                    ).thenApply(infoList -> { 
                                    //do something with info list that doens't return anything
                                    // apparently we HAVE to return null, as callanbles have to return a value
                                    return null;
                                }
                    )
            ).collect(Collectors.toList());
}

Проблема в том, что я получаю ошибку компиляции, потому что код в методе возвращает CompletableFuture<List<Object>> вместо CompletableFuture<List<Void>>.Что я здесь не так делаю?

Я думал об удалении return null, но, как я уже упоминал в комментарии, кажется, что при вызове мы должны возвращать значение, иначе возникла бы другая ошибка компиляции:Incompatible types: expected not void but the lambda body is a block that is not value-compatible

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

thenApply Тип возврата метода - CompletableFuture<U>, что означает возвращение CompletableFuture со значением, возвращаемым функцией

public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn)

Возвращает новый CompletionStage, который, когда этот этап завершается нормально,выполняется с результатом этого этапа в качестве аргумента переданной функции.См. Документацию CompletionStage для правил, охватывающих исключительное завершение.

Type Parameters:
U - the function's return type

Parameters:
fn - the function to use to compute the value of the returned CompletionStage

Использование thenAccept метод, который возвращает CompletableFuture типа Void

public CompletableFuture<Void> thenAccept(Consumer<? super T> action)

Возвращает новый CompletionStage, который, когдаэтот этап завершается нормально, выполняется с результатом этого этапа в качестве аргумента переданного действия.См. Документацию CompletionStage для правил, касающихся исключительного завершения.

Parameters:
action - the action to perform before completing the returned CompletionStage
1 голос
/ 20 сентября 2019

Answer by Deadpool - правильное решение, но вы также можете заставить thenApply вернуть CompletableFuture<Void> двумя способами:

  • Укажите универсальныйаргумент типа:

    ).<Void>thenApply(infoList -> {
    
  • Приведите возвращаемое значение:

    return (Void) null;
    

Конечно, вы можете сделать и то и другое, но это будет избыточно.

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