Package com.apple.foundationdb.async
Class AsyncUtil
- java.lang.Object
-
- com.apple.foundationdb.async.AsyncUtil
-
public class AsyncUtil extends java.lang.Object
Provided utilities for using and manipulatingCompletableFuture
s.
-
-
Field Summary
Fields Modifier and Type Field Description static java.util.concurrent.CompletableFuture<java.lang.Void>
DONE
A completed future of typeVoid
.static java.util.concurrent.CompletableFuture<java.lang.Boolean>
READY_FALSE
A completed future of typeBoolean
that is set tofalse
.static java.util.concurrent.CompletableFuture<java.lang.Boolean>
READY_TRUE
A completed future of typeBoolean
that is set totrue
.
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static <I,O>
java.util.concurrent.CompletableFuture<O>applySafely(java.util.function.Function<I,? extends java.util.concurrent.CompletableFuture<O>> func, I value)
RunFunction
func
, returning all caught exceptions as aCompletableFuture
in an error state.static <V> java.util.concurrent.CompletableFuture<java.util.List<V>>
collect(AsyncIterable<V> iterable)
Iterates over a stream of items and returns the result as a list.static <V> java.util.concurrent.CompletableFuture<java.util.List<V>>
collect(AsyncIterable<V> iterable, java.util.concurrent.Executor executor)
Iterates over a set of items and returns the result as a list.static <V> java.util.concurrent.CompletableFuture<java.util.List<V>>
collectRemaining(AsyncIterator<V> iterator)
Iterates over a set of items and returns the remaining results as a list.static <V> java.util.concurrent.CompletableFuture<java.util.List<V>>
collectRemaining(AsyncIterator<V> iterator, java.util.concurrent.Executor executor)
Iterates over a set of items and returns the remaining results as a list.static <V> java.util.concurrent.CompletableFuture<V>
composeExceptionally(java.util.concurrent.CompletableFuture<V> task, java.util.function.Function<java.lang.Throwable,java.util.concurrent.CompletableFuture<V>> fn)
Composes an asynchronous task with an exception-handler that returns aCompletableFuture
of the same type.static <V,T>
java.util.concurrent.CompletableFuture<T>composeHandle(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler)
Compose a handler bi-function to the result of a future.static <V,T>
java.util.concurrent.CompletableFuture<T>composeHandleAsync(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler)
Compose a handler bi-function to the result of a future.static <V,T>
java.util.concurrent.CompletableFuture<T>composeHandleAsync(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler, java.util.concurrent.Executor executor)
Compose a handler bi-function to the result of a future.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
forEach(AsyncIterable<V> iterable, java.util.function.Consumer<? super V> consumer)
Run theconsumer
on each element of the iterable in order.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
forEach(AsyncIterable<V> iterable, java.util.function.Consumer<? super V> consumer, java.util.concurrent.Executor executor)
Run theconsumer
on each element of the iterable in order.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
forEachRemaining(AsyncIterator<V> iterator, java.util.function.Consumer<? super V> consumer)
Run theconsumer
on each element remaining in the iterator in order.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
forEachRemaining(AsyncIterator<V> iterator, java.util.function.Consumer<? super V> consumer, java.util.concurrent.Executor executor)
Run theconsumer
on each element remaining if the iterator in order.static <V> java.util.concurrent.CompletableFuture<java.util.List<V>>
getAll(java.util.Collection<java.util.concurrent.CompletableFuture<V>> tasks)
Collects the results of many asynchronous processes into one asynchronous output.static <V,T>
AsyncIterable<T>mapIterable(AsyncIterable<V> iterable, java.util.function.Function<V,T> func)
Map anAsyncIterable
into anAsyncIterable
of another type or with each element modified in some fashion.static <V,T>
AsyncIterator<T>mapIterator(AsyncIterator<V> iterator, java.util.function.Function<V,T> func)
Map anAsyncIterator
into anAsyncIterator
of another type or with each element modified in some fashion.static <V,T>
CloseableAsyncIterator<T>mapIterator(CloseableAsyncIterator<V> iterator, java.util.function.Function<V,T> func)
Map aCloseableAsyncIterator
into aCloseableAsyncIterator
of another type or with each element modified in some fashion.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
success(java.util.concurrent.CompletableFuture<V> task)
Maps the outcome of a task into a completion signal.static <V,T>
java.util.concurrent.CompletableFuture<V>tag(java.util.concurrent.CompletableFuture<T> task, V value)
Replaces the output of an asynchronous task with a predetermined value.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
whenAll(java.util.Collection<? extends java.util.concurrent.CompletableFuture<V>> input)
Return aCompletableFuture
that will be set when all theCompletableFuture
inputs are done.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
whenAny(java.util.Collection<? extends java.util.concurrent.CompletableFuture<V>> input)
Return aCompletableFuture
that will be set when any of theCompletableFuture
inputs are done.static <V> java.util.concurrent.CompletableFuture<java.lang.Void>
whenReady(java.util.concurrent.CompletableFuture<V> task)
Maps the readiness of aCompletableFuture
into a completion signal.static java.util.concurrent.CompletableFuture<java.lang.Void>
whileTrue(java.util.function.Function<java.lang.Void,? extends java.util.concurrent.CompletableFuture<java.lang.Boolean>> body)
Deprecated.Since version 5.1.0.static java.util.concurrent.CompletableFuture<java.lang.Void>
whileTrue(java.util.function.Function<java.lang.Void,? extends java.util.concurrent.CompletableFuture<java.lang.Boolean>> body, java.util.concurrent.Executor executor)
Deprecated.Since version 5.1.0.static java.util.concurrent.CompletableFuture<java.lang.Void>
whileTrue(java.util.function.Supplier<java.util.concurrent.CompletableFuture<java.lang.Boolean>> body)
Executes an asynchronous operation repeatedly until it returnsFalse
.static java.util.concurrent.CompletableFuture<java.lang.Void>
whileTrue(java.util.function.Supplier<java.util.concurrent.CompletableFuture<java.lang.Boolean>> body, java.util.concurrent.Executor executor)
Executes an asynchronous operation repeatedly until it returnsFalse
.
-
-
-
Field Detail
-
DONE
public static final java.util.concurrent.CompletableFuture<java.lang.Void> DONE
A completed future of typeVoid
. In particular, it is completed tonull
, but that shouldn't really matter for theVoid
type. This can be used instead of creating a new future if one wants to signal that some asynchronous task has already been completed.
-
READY_TRUE
public static final java.util.concurrent.CompletableFuture<java.lang.Boolean> READY_TRUE
A completed future of typeBoolean
that is set totrue
. This can be used instead of creating a new future if one wants to signal that some task has already been completed with atrue
result.
-
READY_FALSE
public static final java.util.concurrent.CompletableFuture<java.lang.Boolean> READY_FALSE
A completed future of typeBoolean
that is set tofalse
. This can be used instead of creating a new future if one wants to signal that some task has already been completed with afalse
result.
-
-
Method Detail
-
applySafely
public static <I,O> java.util.concurrent.CompletableFuture<O> applySafely(java.util.function.Function<I,? extends java.util.concurrent.CompletableFuture<O>> func, I value)
RunFunction
func
, returning all caught exceptions as aCompletableFuture
in an error state.- Type Parameters:
I
- type of input tofunc
O
- type of output offunc
- Parameters:
func
- theFunction
to runvalue
- the input to pass tofunc
- Returns:
- the output of
func
, or aCompletableFuture
carrying any exception caught in the process.
-
forEach
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> forEach(AsyncIterable<V> iterable, java.util.function.Consumer<? super V> consumer)
Run theconsumer
on each element of the iterable in order. The future will complete with either the first error encountered by either the iterable itself or by the consumer provided or withnull
if the future completes successfully. Items are processed in order from the iterable, and each item will be processed only after the item before it has finished processing.- Type Parameters:
V
- type of the items returned by the iterable- Parameters:
iterable
- the source of data over from which to consumeconsumer
- operation to apply to each item- Returns:
- a future that is ready once the asynchronous operation completes
-
forEach
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> forEach(AsyncIterable<V> iterable, java.util.function.Consumer<? super V> consumer, java.util.concurrent.Executor executor)
Run theconsumer
on each element of the iterable in order. The future will complete with either the first error encountered by either the iterable itself or by the consumer provided or withnull
if the future completes successfully. Items are processed in order from the iterable, and each item will be processed only after the item before it has finished processing. Asynchronous tasks needed to complete this operation are scheduled on the provided executor.- Type Parameters:
V
- type of the items returned by the iterable- Parameters:
iterable
- the source of data over from which to consumeconsumer
- operation to apply to each itemexecutor
- executor on which to schedule asynchronous tasks- Returns:
- a future that is ready once the asynchronous operation completes
-
forEachRemaining
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> forEachRemaining(AsyncIterator<V> iterator, java.util.function.Consumer<? super V> consumer)
Run theconsumer
on each element remaining in the iterator in order. The future will complete with either the first error encountered by either the iterator itself or by the consumer provided or withnull
if the future completes successfully. Items are processed in order from the iterator, and each item will be processed only after the item before it has finished processing.- Type Parameters:
V
- type of the items returned by the iterator- Parameters:
iterator
- the source of data over from which to consumeconsumer
- operation to apply to each item- Returns:
- a future that is ready once the asynchronous operation completes
-
forEachRemaining
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> forEachRemaining(AsyncIterator<V> iterator, java.util.function.Consumer<? super V> consumer, java.util.concurrent.Executor executor)
Run theconsumer
on each element remaining if the iterator in order. The future will complete with either the first error encountered by either the iterator itself or by the consumer provided or withnull
if the future completes successfully. Items are processed in order from the iterator, and each item will be processed only after the item before it has finished processing. Asynchronous tasks needed to complete this operation are scheduled on the provided executor.- Type Parameters:
V
- type of the items returned by the iterator- Parameters:
iterator
- the source of data over from which to consumeconsumer
- operation to apply to each itemexecutor
- executor on which to schedule asynchronous tasks- Returns:
- a future that is ready once the asynchronous operation completes
-
collect
public static <V> java.util.concurrent.CompletableFuture<java.util.List<V>> collect(AsyncIterable<V> iterable)
Iterates over a stream of items and returns the result as a list.- Type Parameters:
V
- type of the items returned by the iterable- Parameters:
iterable
- the source of data over which to iterate- Returns:
- a
CompletableFuture
which will be set to the amalgamation of results from iteration.
-
collectRemaining
public static <V> java.util.concurrent.CompletableFuture<java.util.List<V>> collectRemaining(AsyncIterator<V> iterator)
Iterates over a set of items and returns the remaining results as a list.- Type Parameters:
V
- type of the items returned by the iterator- Parameters:
iterator
- the source of data over which to iterate. This function will exhaust the iterator.- Returns:
- a
CompletableFuture
which will be set to the amalgamation of results from iteration.
-
collect
public static <V> java.util.concurrent.CompletableFuture<java.util.List<V>> collect(AsyncIterable<V> iterable, java.util.concurrent.Executor executor)
Iterates over a set of items and returns the result as a list.- Type Parameters:
V
- type of the items returned by the iterable- Parameters:
iterable
- the source of data over which to iterateexecutor
- theExecutor
to use for asynchronous operations- Returns:
- a
CompletableFuture
which will be set to the amalgamation of results from iteration.
-
collectRemaining
public static <V> java.util.concurrent.CompletableFuture<java.util.List<V>> collectRemaining(AsyncIterator<V> iterator, java.util.concurrent.Executor executor)
Iterates over a set of items and returns the remaining results as a list.- Type Parameters:
V
- type of the items returned by the iterator- Parameters:
iterator
- the source of data over which to iterate. This function will exhaust the iterator.executor
- theExecutor
to use for asynchronous operations- Returns:
- a
CompletableFuture
which will be set to the amalgamation of results from iteration.
-
mapIterable
public static <V,T> AsyncIterable<T> mapIterable(AsyncIterable<V> iterable, java.util.function.Function<V,T> func)
Map anAsyncIterable
into anAsyncIterable
of another type or with each element modified in some fashion.- Type Parameters:
V
- type of the items returned by the original iterableT
- type of the items returned by the final iterable- Parameters:
iterable
- inputfunc
- mapping function applied to each element- Returns:
- a new iterable with each element mapped to a different value
-
mapIterator
public static <V,T> AsyncIterator<T> mapIterator(AsyncIterator<V> iterator, java.util.function.Function<V,T> func)
Map anAsyncIterator
into anAsyncIterator
of another type or with each element modified in some fashion.- Type Parameters:
V
- type of the items returned by the original iteratorT
- type of the items returned by the final iterator- Parameters:
iterator
- inputfunc
- mapping function applied to each element- Returns:
- a new iterator with each element mapped to a different value
-
mapIterator
public static <V,T> CloseableAsyncIterator<T> mapIterator(CloseableAsyncIterator<V> iterator, java.util.function.Function<V,T> func)
Map aCloseableAsyncIterator
into aCloseableAsyncIterator
of another type or with each element modified in some fashion.- Type Parameters:
V
- type of the items returned by the original iteratorT
- type of the items returned by the final iterator- Parameters:
iterator
- inputfunc
- mapping function applied to each element- Returns:
- a new iterator with each element mapped to a different value
-
whileTrue
@Deprecated public static java.util.concurrent.CompletableFuture<java.lang.Void> whileTrue(java.util.function.Function<java.lang.Void,? extends java.util.concurrent.CompletableFuture<java.lang.Boolean>> body)
Deprecated.Since version 5.1.0. Use the version ofwhileTrue
that takes aSupplier
instead.Executes an asynchronous operation repeatedly until it returnsFalse
.- Parameters:
body
- the asynchronous operation over which to loop- Returns:
- a
CompletableFuture
which will be set at completion of the loop.
-
whileTrue
@Deprecated public static java.util.concurrent.CompletableFuture<java.lang.Void> whileTrue(java.util.function.Function<java.lang.Void,? extends java.util.concurrent.CompletableFuture<java.lang.Boolean>> body, java.util.concurrent.Executor executor)
Deprecated.Since version 5.1.0. Use the version ofwhileTrue
that takes aSupplier
instead.Executes an asynchronous operation repeatedly until it returnsFalse
.- Parameters:
body
- the asynchronous operation over which to loopexecutor
- theExecutor
to use for asynchronous operations- Returns:
- a
CompletableFuture
which will be set at completion of the loop.
-
whileTrue
public static java.util.concurrent.CompletableFuture<java.lang.Void> whileTrue(java.util.function.Supplier<java.util.concurrent.CompletableFuture<java.lang.Boolean>> body)
Executes an asynchronous operation repeatedly until it returnsFalse
.- Parameters:
body
- the asynchronous operation over which to loop- Returns:
- a
CompletableFuture
which will be set at completion of the loop.
-
whileTrue
public static java.util.concurrent.CompletableFuture<java.lang.Void> whileTrue(java.util.function.Supplier<java.util.concurrent.CompletableFuture<java.lang.Boolean>> body, java.util.concurrent.Executor executor)
Executes an asynchronous operation repeatedly until it returnsFalse
.- Parameters:
body
- the asynchronous operation over which to loopexecutor
- theExecutor
to use for asynchronous operations- Returns:
- a
CompletableFuture
which will be set at completion of the loop.
-
success
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> success(java.util.concurrent.CompletableFuture<V> task)
Maps the outcome of a task into a completion signal. Can be useful iftask
has side-effects for which all is needed is a signal of completion. All errors fromtask
will be passed to the resultingCompletableFuture
.- Type Parameters:
V
- type of element returned bytask
- Parameters:
task
- the asynchronous process for which to signal completion- Returns:
- a newly created
CompletableFuture
that is set whentask
completes
-
whenReady
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> whenReady(java.util.concurrent.CompletableFuture<V> task)
Maps the readiness of aCompletableFuture
into a completion signal. When the givenCompletableFuture
is set to a value or an error, the returnedCompletableFuture
will be set to null. The returnedCompletableFuture
will never be set to an error unless it is explicitly cancelled.- Type Parameters:
V
- return type of the asynchronous task- Parameters:
task
- the asynchronous process to monitor the readiness of- Returns:
- a new
CompletableFuture
that is set whentask
is ready.
-
composeExceptionally
public static <V> java.util.concurrent.CompletableFuture<V> composeExceptionally(java.util.concurrent.CompletableFuture<V> task, java.util.function.Function<java.lang.Throwable,java.util.concurrent.CompletableFuture<V>> fn)
Composes an asynchronous task with an exception-handler that returns aCompletableFuture
of the same type. Iftask
completes normally, this will return aCompletableFuture
with the same value astask
. Iftask
completes exceptionally, this will callfn
with the exception returned bytask
and return the result of theCompletableFuture
returned by that function.- Type Parameters:
V
- return type of the asynchronous task- Parameters:
task
- the asynchronous process to handle exceptions fromfn
- a function mapping exceptions fromtask
to aCompletableFuture
of the same type astask
- Returns:
- a
CompletableFuture
that contains the value returned bytask
iftask
completes normally and the result offn
iftask
completes exceptionally
-
composeHandle
public static <V,T> java.util.concurrent.CompletableFuture<T> composeHandle(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler)
Compose a handler bi-function to the result of a future. Unlike theCompletableFuture.handle()
function, which requires that the handler return a regular value, this method requires that the handler return aCompletableFuture
. The returned future will then be ready with the result of the handler's future (or an error if that future completes exceptionally).- Type Parameters:
V
- return type of original futureT
- return type of final future- Parameters:
future
- future to compose the handler ontohandler
- handler bi-function to compose onto the passed future- Returns:
- future with same completion properties as the future returned by the handler
-
composeHandleAsync
public static <V,T> java.util.concurrent.CompletableFuture<T> composeHandleAsync(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler)
Compose a handler bi-function to the result of a future. Unlike theCompletableFuture.handle()
function, which requires that the handler return a regular value, this method requires that the handler return aCompletableFuture
. The returned future will then be ready with the result of the handler's future (or an error if that future completes exceptionally). The handler will execute on thedefault executor
used for asychronous tasks.- Type Parameters:
V
- return type of original futureT
- return type of final future- Parameters:
future
- future to compose the handler ontohandler
- handler bi-function to compose onto the passed future- Returns:
- future with same completion properties as the future returned by the handler
-
composeHandleAsync
public static <V,T> java.util.concurrent.CompletableFuture<T> composeHandleAsync(java.util.concurrent.CompletableFuture<V> future, java.util.function.BiFunction<V,java.lang.Throwable,? extends java.util.concurrent.CompletableFuture<T>> handler, java.util.concurrent.Executor executor)
Compose a handler bi-function to the result of a future. Unlike theCompletableFuture.handle()
function, which requires that the handler return a regular value, this method requires that the handler return aCompletableFuture
. The returned future will then be ready with the result of the handler's future (or an error if that future completes excpetionally). The handler will execute on the passedExecutor
.- Type Parameters:
V
- return type of original futureT
- return type of final future- Parameters:
future
- future to compose the handler ontohandler
- handler bi-function to compose onto the passed futureexecutor
- executor on which to execute the handler function- Returns:
- future with same completion properties as the future returned by the handler
-
getAll
public static <V> java.util.concurrent.CompletableFuture<java.util.List<V>> getAll(java.util.Collection<java.util.concurrent.CompletableFuture<V>> tasks)
Collects the results of many asynchronous processes into one asynchronous output. If any of the tasks returns an error, the output is set to that error.- Type Parameters:
V
- return type of the asynchronous tasks- Parameters:
tasks
- the tasks whose output is to be added to the output- Returns:
- a
CompletableFuture
that will be set to the collective result of the tasks
-
tag
public static <V,T> java.util.concurrent.CompletableFuture<V> tag(java.util.concurrent.CompletableFuture<T> task, V value)
Replaces the output of an asynchronous task with a predetermined value.- Type Parameters:
V
- return type of original futureT
- return type of final future- Parameters:
task
- the asynchronous process whose output is to be replacedvalue
- the predetermined value to be returned on success oftask
- Returns:
- a
CompletableFuture
that will be set tovalue
on completion oftask
-
whenAny
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> whenAny(java.util.Collection<? extends java.util.concurrent.CompletableFuture<V>> input)
Return aCompletableFuture
that will be set when any of theCompletableFuture
inputs are done. ACompletableFuture
is done both on success and failure.- Type Parameters:
V
- return type of the asynchronous tasks- Parameters:
input
- the list ofCompletableFuture
s to monitor. This list must not be modified during the execution of this call.- Returns:
- a signal that will be set when any of the
CompletableFuture
s are done
-
whenAll
public static <V> java.util.concurrent.CompletableFuture<java.lang.Void> whenAll(java.util.Collection<? extends java.util.concurrent.CompletableFuture<V>> input)
Return aCompletableFuture
that will be set when all theCompletableFuture
inputs are done. ACompletableFuture
is done both on success and failure.- Type Parameters:
V
- return type of the asynchronous tasks- Parameters:
input
- the list ofCompletableFuture
s to monitor. This list must not be modified during the execution of this call.- Returns:
- a signal that will be set when all of the
CompletableFuture
s are done
-
-