2015-11-02 4 views
4

В Java 8 я пишу метод DAO, который вызывает метод, который возвращает ListenableFuture (в этом случае это асинхронный запрос Cassandra, который возвращает ResultSetFuture).Как вернуть свои собственные фьючерсы в Java?

Однако я зациклился на том, как я должен вернуть Будущее вызывающему методу DAO. Я не могу просто вернуть ResultSetFuture, потому что это будущее возвращает ResultSet. Я хочу обработать ResultSet и вернуть другой объект. Например:

public ListenableFuture<ThingObj> queryForThingAsync(String thingId) { 
    ListenableFuture<ResultSet> rsFuture = db.getSession().executeAsync(QueryBuilder.select().all().from("thingSchema","Thing").where(eq("thingId",thingId))); 
    // Now what? How do I create a ListenableFuture<ThingObj> given a ListenableFuture<ResultSet> and a method that can convert a ResultSet into a ThingObj? 
} 
+0

вы используете типы параллельности Java 8, или Гуава ? У Guava есть тип ListenableFuture, JDK этого не делает. –

+0

Cassandra api возвращает ListenableFuture, однако я был бы счастлив использовать типы параллелизма Java 8. Я действительно не заметил, что ListenableFuture был из guava. Теперь я понимаю, что CompletableFuture, вероятно, является подходящим классом. Тем не менее, я все еще не уверен, как это сделать. – HappyEngineer

+0

ОК - я обновляю свой ответ, чтобы включить альтернативное решение, используя 'CompletableFuture'. –

ответ

4

Так как кажется вы используете гуавы-х ListenableFuture, самым простым решением является transform метод из Futures:

Возвращает новый ListenableFuture, результатом которого является продуктом применения данной функции к результату данного Будущего.

Есть несколько способов, чтобы использовать его, но так как вы на Java 8, самый простой, вероятно, со ссылкой метод:

public ListenableFuture<ThingObj> queryForThingAsync(String thingId) { 
    ListenableFuture<ResultSet> rsFuture = db.getSession().executeAsync(QueryBuilder.select().all().from("thingSchema","Thing").where(eq("thingId",thingId))); 
    return Futures.transform(rsFuture, Utils::convertToThingObj); 
} 
+1

Я нашел конвертер java8-guava (https://github.com/lukas-krecan/future-converter/blob/master/README.md), который преобразует два типа. Я просто использую FutureConverter.toCompletableFuture для преобразования из ListenableFuture в CompletableFuture. Затем я вызываю thenApply на CompletableFuture. Это похоже на то же, что и Futures.transform. Благодаря! – HappyEngineer

Смежные вопросы