Как назначить возвращаемый тип завершитьFuture.supplyAsync () для объекта? - PullRequest
1 голос
/ 04 апреля 2019

Я определил completetableFuture.supplyAsync () внутри цикла foreach, поэтому каждая запись (каждая асинхронная задача) добавляет список, и мне нужно получить окончательный список (после всех списков добавления асинхронной задачи) из completetableFuture.supplyAsync (). Как достичь этого?

Фрагмент кода:

    unporcessedList.forEach(entry -> {                       
    CompletableFuture<List<ChangeLog>> cf =  
    CompletableFuture.supplyAsync((Supplier<List<ChangeLog>>) () -> {                            
    mongoDBHelper.processInMongo(entry, getObject(entry, map),entryList);
    return entryList;
    }, executor); 
    });

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Неблокирующая версия

Общий пример:

    List<String> entries = new ArrayList<>(2);
    entries.add("first");
    entries.add("second");

    List<CompletableFuture<String>> completableFutures = entries.stream()
            .map((entry) -> {
                        return CompletableFuture.supplyAsync(() -> {
                            try {
                                Thread.sleep(new Random().nextInt(5000) + 500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            return entry.concat(String.valueOf(entry.length()));
                        }).thenApply((e) -> new StringBuilder(e).reverse().toString());
                    }
            ).collect(Collectors.toList());

    CompletableFuture
            .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]))
            .thenApply((v) -> completableFutures.stream().map((cf) -> cf.join()))
            .get()
            .forEach(System.out::println);

Ваш случай:

    List<CompletableFuture<List<ChangeLog>>> completableFutures = unporcessedList.stream()
            .map((entry) -> {
                        return CompletableFuture.supplyAsync((Supplier<List<ChangeLog>>) () -> {
                            mongoDBHelper.processInMongo(entry, getObject(entry, map), entryList);
                            return entryList;
                        }, executor);
                    }
            ).collect(Collectors.toList());

    CompletableFuture
            .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]))
            .thenApply((v) -> completableFutures.stream().map((cf) -> cf.join()))
            .get()
            .forEach(System.out::println);
1 голос
/ 04 апреля 2019

Вы можете использовать метод get (), который заблокирует ваше приложение, пока будущее не будет завершено. Так что используйте что-то вроде этого:

// Block and get the result of the Future
Supplier<List<ChangeLog>> result = cf.get();

Дополнительные примеры описаны здесь: https://www.callicoder.com/java-8-completablefuture-tutorial/

Надеюсь, это поможет.

...