Как превратить список‹Элемент› в карту‹Элемент, Completeablefuture‹xyz››

У меня есть асинхронный метод с полным будущим результатом:

public CompletableFuture<DogLater> asyncDogLater(String dogName){}

У меня есть список собак:

List<Dog> dogs;

Теперь я хочу создать карту от имени собаки до Completeablefuture:

Map<String, CompletableFuture<DogLater>> map;

После проверки этого и это я пытался сделать так:

    Map<String, CompletableFuture<DogLater>> completableFutures = dogs.stream()
            .collect( Collectors.toMap(Dog::getName,
                                       asyncDogLater(Dog::getName )));

Но компилятор жалуется, что первый Dog::getName проблематичен, так как:

На нестатический метод нельзя ссылаться из статического контекста

И второй Dog::getName имеет ошибку:

Строка не является функциональным интерфейсом

Я также проверил этот пост, но я все еще не уверен, как решить это.


person riorio    schedule 05.06.2019    source источник
comment
Вам нужно toMap(Dog::getName, d -> asyncDogLater(d.getName())).   -  person daniu    schedule 05.06.2019
comment
@daniu работает отлично. Вы хотели бы добавить это в качестве ответа на похвалу?   -  person riorio    schedule 05.06.2019


Ответы (1)


Второй аргумент Collectors.toMap() должен иметь тип Function<T,R>, в вашем случае Function<Dog,CompletableFuture<DogLater>>.

asyncDogLater(Dog::getName) относится к типу Function<Function<Dog, String>, CompletableFuture<DogLater>>, если я не ошибаюсь.

Вам нужно toMap(Dog::getName, d -> asyncDogLater(d.getName())).

person daniu    schedule 05.06.2019